2016-11-23 67 views
0

我有一個JButton,讓我們把它稱爲「按鈕」,並添加一個ActionListener它:更改一個JLabel文本的同時,JButton的監聽工作

button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     call(); 
    } 
}); 

它是正確添加到我的框架等。在JFrame的我也有一個JLabel,我想在JButton方法工作的時候改變它的文本(因爲它需要30秒才能完成)。我怎麼做?我必須使用一些多線程的東西嗎? 下面是基本原理(JLabel的被稱爲輸出):

public void call(){ 
    output.setText("test1"); 
    try { Thread.sleep(1000); 
    } catch (InterruptedException e) {} 
    output.setText("test2"); 
} 

這將導致在「輸出」標記在一秒之後被改變到「TEST2」。我怎樣才能讓它立即顯示「test1」?

+0

刪除'output.setText(「test1」);'... – Reimeus

回答

2

不要使用Thread.sleep()。這將阻止GUI重新繪製自己。

我是否必須使用一些多線程的東西?

是的。

對於長時間運行的任務,您需要單獨啓動Thread,因此GUI可以保持響應。

在這種情況下,您可以使用SwingWorker

有關詳細信息和使用SwingWorker的示例,請閱讀有關Concurrency的Swing教程的部分。

+0

之後的所有東西是有道理的,它是有道理的,按鈕保持在按下狀態,而方法正在工作,因爲你可以1)看到當腳本完成後2)不要再按一次,直到它完成 – Xerus

+0

@Xerus,不,它沒有任何意義。每次調用長時間運行的任務時,都不應設計一個凍結的應用程序。如果你想給用戶視覺反饋,那麼你應該使用'JProgressBar'。有關詳細信息,請參閱[如何使用進度條](http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html)上的Swing教程部分。 – camickr

+0

謝謝!當我製作一個更復雜的項目時,我會深入研究它 – Xerus