2013-03-08 62 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

的工藝方法
相關問題