我的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()方法为我的jbutton编写了ActionListener,如下所示:
public void actionPerformed(ActionEvent e){ //some code //newClass.doTheCleaning(); }
我知道如何做剩下的事情,例如addActionListener()和其他东西,因此无需对此进行质疑。我担心的是,调用doTheCleaning()方法时在GUI中所做的所有更改仅在单击按钮后才适用。发生这种情况时,不会显示在我的标签和文本区域中发生的更改之间的连续性。如果我直接在测试器类中调用该代码,则该代码运行良好,但在actionperformed方法内部调用该代码仅显示GUI的最终状态。我需要显示首先更改哪个元素,然后显示下一步,依此类推。
当我仅在单击JButton时才需要进行这些更改时,如何实现?
**我还不太擅长在Java中使用GUI。我希望你们能理解我的观点,而无需我给出代码。但如有必要,我可以。谢谢。
不要在EDT中执行任何密集的操作,否则GUI将无响应,并且您可能看不到GUI更新。您可以使用的最佳选择是SwingWorker:
SwingWorker
重写doInBackground(),并将任何长时间的操作放入此方法内,以便它将在单独的线程而不是EDT上运行。
doInBackground()
对于任何GUI创建或其中GUI组件的状态更改doInBackground(),请使用publish(V... chunks)将数据发送到process(List<V> chunks)。您需要覆盖process(List<V> chunks)。另请注意,它process(List<V> chunks)是在EDT上执行的。
publish(V... chunks)
process(List<V> chunks)
后doInBackground()返回时,done()执行上EDT,你可以重写它使用它的任何GUI更新。您还可以检索返回的值doInBackground()使用get()。
done()
get()
请注意,这SwingWorker<T,V>是通用的,您需要指定类型。T从返回的对象的类型doInBackground()和get(),而V是你传递到元素的类型process(List<V> chunks)通过publish(V... chunks)。
SwingWorker<T,V>
T
V
execute()方法首先调用Swing工人doInBackground()。
execute()
有关更多信息,请阅读Swing中的并发。