我有一个主程序,其中GUI是基于swing的,并且取决于四种状态之一,GUI元素具有不同的参数。
public class Frame extends JFrame implements Runnable { Status status = 1; ... @Override public void run() { switch (status) { case 1: ... case 2: ... } public void updateGUI(Status status) { this.status = status; SwingUtilities.invokeLater(this); }
而且,如果我想刷新,GUI只会调用具有适当参数的updateGUI,一切都很好。但是该程序还会创建一个附加线程,该线程在处理相关数据后应更改GUI主程序。不幸的是,我无法在此线程中调用方法updateGUI(..)。
我知道我可以使用invokeLater或SwingWorker进行刷新,但是有10个以上的元素,因此我宁愿使用udpateGUI()方法。
我将不胜感激。
如果使status现场线程安全,则可以setStatus直接从后台线程调用。为了使状态线程安全,请将更改放入同步块,并使变量可变,以便其他线程上的更新可见。
status
setStatus
例如
public class Frame extends JFrame implements Runnable { private volatile Status status = 1; ... @Override public void run() { switch (status) { case 1: ... case 2: ... } public void updateGUI(Status status) { setStatus(status); SwingUtilities.invokeLater(this); } private synchronized void setStatus(Status status) { this.status = status; }
完成这些更改后,可以setStatus从任何线程进行调用。