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 chunks) 。 另请注意,在EDT上执行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 。