2013-03-08 67 views
1

我有一个非常繁忙的线程试图做所有事情,它开始减慢我的MouseMotionListener。我想我会把听者在另一个线程,以确保它始终运行尽可能快地就可以了,但只要我做到了:我可以将一个MouseMotionListener添加到Java中的另一个线程吗?

import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 

public class MouseListenerThread extends Thread implements MouseMotionListener { 

    public void run(){ 
     //Concurrency happens here 
    } 

    public void mouseDragged(MouseEvent e) { 
     // Do something 
    } 

    public void mouseMoved(MouseEvent e) { 
     // Do something else 
    } 
} 

我意识到,虽然我能有这等目标函数为鼠标听众,我不能同时做到这一点。有什么方法可以使用运行功能来实现监听?我也会接受任何其他解决方案来加速听众。

谢谢!

+2

在Swing中,您不应该在事件派发线程中进行任何长时间运行。你非常忙的线程应该是你创建的其他线程。您的鼠标监听器将从事件派发线程调用,因此这两个线程不应互相干扰。 – sjr 2013-03-08 22:24:24

+1

如果你有一个影响'EDT'的进程,可以考虑将这个功能放在'SwingWorker'中。 'Mouse'只能在'EDT'中找到, – Reimeus 2013-03-08 22:26:33

+0

所以你只是说要切换这两个类,并让所有的业务都进入备用线程,并让所有的鼠标都听到它在哪里? – user1706538 2013-03-08 22:31:42

回答

4

收到mouseDragged等的实际监听程序必须位于事件调度线程(EDT)上。在这些事件处理方法中正在完成的任何“非GUI”工作可以使用SwingWorker或任何其他线程方法进行其他线程。

所有GUI工作必须在事件调度线程,因此,如果事件处理程序正在放缓,因为GUI的东西下来,你可能会遇到麻烦,但你可以使用SwingUtilities.InvokeLater触发任何线程调度的EDT线程一些工作。你也可以使用InvokeAndWait,但是这是开始得到你的图形用户界面相当紧密的支持...

+0

哈哈,它是一种。那么大量的for循环可以很容易地放在其他地方,所以当这件事几乎没有什么,但绘画和鼠标听,这是我所期望的,是吗? – user1706538 2013-03-08 22:48:05

+2

'所有GUI工作必须在主线程中 - >主线程与GUI线程(EDT)不一样。 – 2013-03-08 22:51:40

+0

100%为真。固定。 – John3136 2013-03-09 04:41:04

2

所有事件由事件调度线程调度。将鼠标监听器放在另一个线程中将完全没有区别,因为事件方法将在EDT上下文中通知。Swing是一个单线程框架。这意味着所有与UI的交互都必须在EDT上下文中执行。因此,即使您可以将工作加载到另一个线程,您也需要使用EDT重新同步UI的任何更改/更新。

您可能想了解详情,请通读Concurrency in Swing

如果你正在执行长时间运行/在美国东部时间内阻塞的任务,宇不妨考虑使用SwingWorker,这将允许你运行在一个单独的线程任务,但为简化更新UI

的工艺方法
相关问题