java - 从可运行程序更新 GUI

标签 java swing user-interface concurrency event-dispatch-thread

我正在构建一个 Swing 应用程序,其中一部分功能应该是以视觉和听觉方式处理和输出一些文本(使用 Mary TTS)。我需要一些关于 GUI 和文本处理类通信的最佳方式的建议。

GUI 类是 JPanel 的子类。在其中,我有一个实现 Runnable 的类,称为 LineProcesser,它准备要分派(dispatch)到音频播放器的文本。我正在使用线程执行器来阻止它进入 EDT(这可能不是最好的方法,但它似乎达到了我想要的结果)。

我的目的是让 LineProcessor 遍历所有文本并在每行末尾更新 JTextArea。此外,它需要在某些时候停止并等待用户输入。用户输入完成后,GUI 类应该告诉它恢复处理。

以下代码说明了我目前拥有的内容:

public class MyPanel extends JPanel {
    ExecutorService lineExecutor = Executors.newSingleThreadExecutor();
    Runnable lineProcessor = new LineProcessor();

    public class LineProcessor implements Runnable {

        private int currentLineNo = 0;

            public LineProcessor() {
            //  ...
            }

            @Override
            public void run() {
                // call getText();  
                // call playAudio();
                currentLineNo++;
            }
        }
    }

    private JButton statusLbl = new JLabel();       
    private JButton mainControlBtn = new JButton();

    private void mainControlBtnActionPerformed(ActionEvent evt) {

        if (mainControlBtn.getText().equals("Start")) {
                          lineExecutor.submit(lineProcessor);
                          mainControlBtn.setText("Running");
        }
    }
}

LineProcessor 如何通知 GUI 组件它们需要更改以及如何从 GUI 内暂停和重新启动它?我很困惑我是否需要 Swing Worker、属性/事件监听器或其他东西?我读过的示例有点道理,但我不知道如何将它们应用到我这里的代码中。

最佳答案

您需要做的就是将所有 Swing 调用包装在 Runnable 中,并通过 SwingUtilities.invokeLater(myRunnable); 将其在 EDT 上排队。就是这样。不需要 SwingWorker。

例如,

public class LineProcessor implements Runnable {
  private int currentLineNo = 0;
  Runnable LineProcessor = new LineProcessor();  // won't this cause infinite recursion?

  public LineProcessor() {
     // ...
  }

  @Override
  public void run() {
     // call getText();
     // call playAudio();
     currentLineNo++;

     SwingUtilities.invokeLater(new Runnable() {
        public void run() {
           // *** Swing code can go here ***
        }
     });
  }
}

关于java - 从可运行程序更新 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10365404/

相关文章:

java - 在 OpenCV 3.2 中返回 Java 中的 Mat 对象

java - 未在 GWT 模块的 .html 文件上调用 Servlet 过滤器

java - 如何让应用程序关闭其 GUI 并在 android 中在后台工作

c++ - 如何在使用 QQmlApplicationEngine 时从 C++ 访问我的 Window 对象属性?

.net - 鼠标滚轮更改的默认 ScrollingOffset

java - ArrayList<class> collection.swap 方法

java - 程序中的子类出了什么问题?

java - 鼠标单击后在 JPanel 上绘制圆圈

java - 更改 JTabbedPane 侧 View 的颜色

显示信息的 Java Swing 小部件