我的 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 中的所有更改仅在单击按钮后才适用。发生这种情况时,标签和文本区域中发生的更改之间的连续性不会显示。如果我直接在测试器类中调用它,那么代码可以正常工作,但在 actionperformed 方法中调用它只显示 GUI 的最终状态。我需要显示哪个元素首先发生变化,然后是接下来的变化,依此类推。
当我需要仅在单击 JButton 时发生这些更改时,如何实现它?
**我还不太擅长用java做GUI。我希望你们在我不给出代码的情况下也能理解我的观点。但如果有必要的话我可以。谢谢。
请勿在内部进行任何密集操作EDT,否则 GUI 将无响应,并且您可能看不到 GUI 更新。您可以使用的最佳选择是SwingWorker:
覆盖doInBackground(),并将任何长操作放入此方法中,以便它将在单独的线程上运行,而不是在EDT.
对于任何 GUI 创建或更改 GUI 组件的状态doInBackground(), use publish(V... chunks)将数据发送到process(List<V> chunks)。你需要覆盖process(List<V> chunks)。另请注意process(List<V> chunks)执行于EDT.
After doInBackground()返回,done()执行于EDT您可以覆盖它以将其用于任何 GUI 更新。您还可以检索从返回的值doInBackground()通过使用get().
注意SwingWorker<T,V> is generic,并且您需要指定类型。T
是返回的对象类型doInBackground() and get(), while V
是您传递给的元素的类型process(List<V> chunks) via publish(V... chunks).
execute()方法通过调用启动 Swing WorkerdoInBackground() first.
有关这方面的更多信息,请阅读Swing 中的并发.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)