2012-12-12 41 views
1

我添加了一個動作監聽我的按鈕:如何更新actionPerformed()內的JFrame?

myButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) 
    { 
     myButtonAction(); 
    } 
}); 

該按鈕將啓動阻塞/賣出看漲。我想在調用發生之前更新JFrame(一些組件) - 通知用戶。但是,對於JFrame,似乎沒有立即着色。我應該怎麼做?

此時任何變化,包括myButton.setEnabled(false)都不會得到更新,直到​​完成。

我應該真的只是創建新的線程(非與用戶界面相關)嗎?這對我來說似乎是一個輕量級的任務。

+0

無論你的任務是快速/快速/輕量級和其他線程是不必要的,要麼它不夠快,你應該將其移動到另一個線程。請記住,您絕對不應該在EDT(Event Dispatching Thread)之外修改UI。 SwingUtilities.invokeLater/invokeAndWait可以爲SwingWorker提供幫助。 –

+0

我想我應該使用一個線程 - 我只是新手知道SwingWorkers,所以應該不斷創建和銷燬線程。我想添加一個問題,但按鈕的actionPerformed在EDT上調用是不是? – christopher

+0

是的,當然是:'ActionEvent'是一個'Event'並且像事件派發線程中的所有其他事件一樣被調度。 –

回答

1

是的,你應該在另一個線程上運行它。首先,我不認爲它是「輕量級」的。

如果需要,可以重新使用線程,請參見SwingWorkerThreadPoolExecutor

+0

這是答案,加強了我最初的想法。但!爲什麼你不認爲它是輕量級的?假設我有一項任務需要幾秒鐘的時間。我希望能夠在此期間禁用按鈕。爲此創造一個工人真的值得嗎? – christopher

+0

不保證立即返回的所有內容都太慢。即使它不是當你測試它。如果你的程序在後臺執行任務 - 虛擬機暫停執行GC - 操作系統在後臺執行任務 - 你在一臺較慢的機器上運行? – ignis

+0

感謝ignis。你已通知。公認 – christopher