繁体   English   中英

用java中的另一个线程刷新GUI(swing)

[英]Refreshing GUI by another thread in java (swing)

我有一个主程序,其中 GUI 基于摆动,并且根据四种状态之一,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()。

我将不胜感激任何提示。

这是一个小片段,您可以添加到方法中以确保它在 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
   ...
}

如果您使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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM