用java中的另一个线程刷新GUI(swing)
我有一个主要的程序,其中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,一切都很好。 但是程序还会创build一个额外的线程,在处理完相关的数据之后,应该更改GUI主程序。 不幸的是我不能在这个线程中调用updateGUI(..)方法。
我知道我可以使用invokeLater或SwingWorker来刷新,但有超过10个元素,所以我宁愿使用方法udpateGUI()。
我会很感激任何提示。
如果您使status
字段线程安全,则可以直接从后台线程调用setStatus
。 为使线程安全状态,请将更改置于同步块中,并使variables易变,以使其他线程上的更新可见。
例如
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
。
这里有一小段你可以添加到一个方法,以确保它在GUI线程中执行。 它依赖于isEventDispatchThread()
。
public void updateGUI(final Status status) { if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { updateGUI(status); } }); return; } //Now edit your gui objects ... }