0

我有一个 JWindow 和一个 JFrame 都可以运行,并且都实现了鼠标侦听器。我要为我的一个项目做很多测试,为了简化它,我希望能够自动化其中的大部分,所以我开始了自己的鼠标记录器和回放器(使用 Java 机器人类)。

有点像简化的 AutoHotKey 或 AutoIt 的东西......但它会在我的 Ubuntu 机器以及我的 Windows 机器上运行!!!

我制作的 JWindow 是半透明的,覆盖了整个屏幕,当您单击它时它会消失并重播对后面对象的单击然后重新出现。这就是录音过程。当用户右键单击时,设置为不可见并重播记录的操作。

在重播期间,我希望该选项能够退出整个应用程序,因此我认为最好的方法是让 JFrame 和 JWindow 可运行。

JFrame 只是他们从应用程序中提供一个关闭选项。

所以,在我的主要课程中,我有

public static void Main(String[] args){
    recorder = new Recorder();
    gui = new GUI();
    Thread tr = new Thread(recorder);
    Thread tg = new Thread(gui);
    tr.setName("Recorder");
    tg.setName("GUI");
    tr.start();
    tg.start();
}

我的理解是 Recorder 和 GUI 是可运行的对象,它们通过新的 Thread 命令制成线程。当我使用 .start() 时,我开始执行线程,系统从这里决定在任何特定时间运行哪个线程。

到 Recorder 和 GUI 类。

public class Recorder
        implements Runnable, MouseListener {

//Constructor and other code

    public void mouseClicked(MouseEvent e) {

        if (e.getButton() == MouseEvent.BUTTON1) {
             //Record events
        }else{
             //Replay events
        }
        System.exit(0);
    }

    public void run() {
        System.out.println("Recorder");
    }
}

public class GUI 
    implements Runnable, MouseListener {

//Constructor, simply constructs JFrame and sets mouselistener to it

   public void mouseClicked(MouseEvent e) {
       System.exit(0);
   }

   public void run() {
        System.out.println("GUI");
   }

}

我的应用程序打印出 Recorder,然后 GUI 允许我记录我的事件,然后右键单击 JWindow 以重播它们...

但是当我单击 JFrame 的关闭按钮甚至在框架中单击鼠标侦听器时,它不会退出,直到所有操作都完全重播?

我确实想知道的一件事是我在运行中投入了什么是什么使线程保持运行?所以当 System.out.println(""); 被执行的线程死了?所以我在它们周围尝试了一个while循环,我的应用程序成功打印了

GUI GUI GUI RECORDER RECORDER GUI RECORDER 等

所以我可以看到它们的线程正在同时运行......只是运行之外的所有其他操作似乎都没有被执行......如何在线程执行中包含我的鼠标侦听器等?

4

2 回答 2

1

ThreadsObjects. 当你有一个Objectthat is aRunnable时,它只是为一个线程提供了一个起点。但是,这并不意味着当另一个线程(在这种情况下MouseListenerRunnable处理Runnable. 当一个方法被调用时,它永远不会切换到另一个线程。如果你想要这个,你需要一个机制。例如,MouseListener可以将任务发布到的队列,然后在您的队列中Runnable.run()继续寻找新任务。

于 2010-03-22T10:44:03.447 回答
1

当 swing 初始化时,它会启动它自己的 Event Dispatch 线程。您的所有侦听器方法都在此线程中执行。您的侦听器对象是否实现可运行并不重要。

请参阅本教程以掌握 Swing 上下文中的多线程基础知识。http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

您的问题的实际答案在本教程的这一部分:

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/cancel.html

但我建议您阅读整个教程。

于 2010-03-22T10:44:05.677 回答