我的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做的不太好 . 我希望你们在没有我提供代码的情况下理解我的观点 . 但如果有必要,我可以 . 谢谢 .
1 回答
不要在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更新 . 您还可以使用get()检索从doInBackground()返回的值 .
请注意SwingWorker<T,V>是generic,您需要指定类型 .
T
是从doInBackground()和get()返回的对象类型,而V
是通过publish(V... chunks)传递给process(List<V> chunks)的元素类型 .execute()方法首先通过调用doInBackground()来启动swing worker .
有关详细信息,请阅读Concurrency in Swing .