我的JButton ActionListener出现问题。我有一个在另一个类中定义的doTheCleaning()方法,在调用时会对我的GUI进行一系列更改。
public void doTheCleaning(){
//change image icon
//had thread.sleep here
//insert to text area
//had thread.sleep here
//etc
}
然后在另一个类中,我实例化了包含我的doTheCleaning()方法的类,并使用我的actionperformed()方法编写了ActionListener,用于我的jbutton,如下所示:
public void actionPerformed(ActionEvent e){
//some code
//newClass.doTheCleaning();
}
我知道如何像addActionListener()那样完成剩下的工作,所以不需要对此提出质疑。我担心的是,调用doTheCleaning()方法时执行的GUI中的所有更改仅在单击按钮后才适用。发生这种情况时,我的标签和textarea中发生的更改之间的连续性未显示。如果我直接在我的测试器类中调用它,但在actionperformed方法中调用它只显示我的GUI的最终状态,代码工作正常。我需要先显示哪个元素已更改,然后是下一个元素,依此类推。
当我需要在单击JButton时发生这些更改时,我怎么能实现它?
**我在java中用GUI做的不太好。我希望你们在没有我提供代码的情况下理解我的观点。但如果有必要,我可以。谢谢。
答案 0 :(得分:12)
不要在EDT内执行任何密集操作,否则GUI将无响应,您可能看不到GUI更新。您可以使用的最佳选择是SwingWorker
:
覆盖doInBackground()
,并在此方法中放置任何长操作,以便它在单独的线程而不是EDT上运行。
对于doInBackground()
中任何GUI创建或更改GUI组件的状态,请使用publish(V... chunks)
将数据发送到process(List<V> chunks)
。您需要覆盖process(List<V> chunks)
。另请注意,process(List<V> chunks)
上执行了EDT。
doInBackground()
返回后,done()
会在EDT上执行,您可以覆盖它以将其用于任何GUI更新。您还可以使用doInBackground()
检索从get()
返回的值。
请注意,SwingWorker<T,V>
为generic,您需要指定类型。 T
是从doInBackground()
和get()
返回的对象类型,而V
是您通过process(List<V> chunks)
传递给publish(V... chunks)
的元素类型。
execute()
方法首先调用doInBackground()
来启动swing工作者。
有关详情,请阅读Concurrency in Swing。