我正在构建一个 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/