1

我有一个非常繁忙的线程试图做所有事情,它开始减慢我的 MouseMotionListener。我想我会把监听器放在另一个线程中,以确保它总是尽可能快地运行,但是一旦我做到了:

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
    }
}

我意识到虽然我可以将这个其他对象功能用作鼠标侦听器,但我不能同时执行此操作。有什么办法可以使用run函数来实现监听吗?我也会接受任何其他加快听众速度的解决方案。

谢谢!

4

2 回答 2

4

接收mouseDraggedetc 的实际侦听器必须在事件调度线程 (EDT) 上。在这些事件处理方法中完成的任何“非 GUI”工作都可以使用SwingWorker或任何其他线程方法转移到其他线程。

所有的 GUI 工作都必须在事件调度线程中,所以如果事件处理程序因为 GUI 的东西而变慢,你可能会遇到麻烦,但你可以使用SwingUtilities.InvokeLater触发任何线程来为 EDT 线程安排一些工作。您也可以使用InvokeAndWait,但这开始将您的 GUI 与支持的图形紧密结合...

于 2013-03-08T22:33:23.393 回答
2

所有事件都由事件调度线程调度。将鼠标侦听器放在另一个线程中绝对没有区别,因为事件方法将在 EDT 的上下文中得到通知

Swing 是一个单线程框架。这意味着与 UI 的所有交互都必须在 EDT 上下文中执行。因此,即使您可以将工作卸载到另一个线程,您也需要使用 EDT 重新同步对 UI 的任何更改/更新。

您可能想通读Swing 中的并发以了解详细信息。

如果您在 EDT 中执行长时间运行/阻塞的任务,您可能希望考虑使用SwingWorker,这将允许您在单独的线程中运行任务,但提供了简化更新 UI 过程的方法

于 2013-03-08T22:34:12.843 回答