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