我有一个 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/