一尘不染

通过Java中的另一个线程刷新GUI(Swing)

java

我有一个主程序,其中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()方法。

我将不胜感激。


阅读 504

收藏
2020-09-08

共1个答案

一尘不染

如果使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从任何线程进行调用。

2020-09-08