java - 线程 : Just what is it that makes them confusing? 两个带有鼠标监听器的可运行程序

标签 java multithreading mouselistener awtrobot

我有一个 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() 时,我开始执行线程,从这里系统决定在任何特定时间运行哪个线程。

进入记录器和 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 循环,我的应用程序成功打印了

图形用户界面 图形用户界面 图形用户界面 录音机 录音机 图形用户界面 录音机 ETC 等等

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

最佳答案

您将线程对象混淆了。当您有一个 Object 时,它是一个 Runnable,它只是为线程提供了一个起点。然而,这并不意味着当另一个线程(在本例中是处理 MouseListener 的 Event 线程)调用 Runnable 中的方法时,该方法由该线程执行执行Runnable。当一个方法被调用时,它永远不会切换到另一个线程。如果你想要这个,你需要一个机制。例如,MouseListener 可以将任务发布到一个队列,然后在您的 Runnable.run() 中继续寻找新任务。

关于java - 线程 : Just what is it that makes them confusing? 两个带有鼠标监听器的可运行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491369/

相关文章:

java - 条件格式仅突出显示无效单元格

c - 为什么网络连接中断会导致 stdin 上出现 EOF?

.net - 禁用 Windows 窗体上的所有事件

c++ - 如何同时填充 std::unordered_map?

java - 如何停止鼠标点击?

java - JButton 在我的 java 代码中不起作用

java - Oracle 包和 Java 包之间的映射

java - Android 创建自定义 key "@hotmail.com","@gmail.com"

java - 打印对象的参数

java - MouseListener 未提供准确的鼠标位置