2016-11-23 66 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