我正在构建一个Swing应用程序,其中一个功能应该是以可视和可听的方式处理和输出一些文本(使用Mary TTS)。我需要一些关于GUI和文本处理类通信的最佳方式的建议。
GUI类是JPanel的子类。在其中,我有一个实现Runnable的类,名为LineProcesser,它准备要发送到音频播放器的文本。我使用线程执行器来避免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如何通知图形用户界面组件它们需要更改,以及如何在图形用户界面中暂停和重新启动?我很困惑,我是否需要一个Swing Worker、属性/事件侦听器或其他什么?我读过的例子有点道理,但我不明白如何将它们应用到我这里的代码中。
发布于 2012-04-29 00:38:09
您所需要做的就是将任何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 ***
}
});
}
}https://stackoverflow.com/questions/10365404
复制相似问题