我构建了一个Swing应用程序,其中一部分功能应该是以可视方式和可听方式处理和输出一些文本(使用Mary TTS)。我需要一些关于GUI和文本处理类进行通信的最佳方式的建议。从可运行的更新GUI
GUI类是JPanel的一个子类。其中我有一个实现Runnable的类,名为LineProcesser,它准备将文本发送给音频播放器。我正在使用线程执行程序来保持美国东部时间(这可能不是最好的方式,但它似乎达到了我以后的结果)。
我的意图是让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,属性/事件监听器或其他东西?我读过的例子是有道理的,但我不明白我可以如何将它们应用于我在这里的代码。
+1好的建议。 'invokeLater'对于进度报告来说是完美的,但是他需要'invokeAndWait'调用'暂停并等待用户输入'部分 – Robin 2012-04-28 16:42:06
aaaaach谢谢你的回答,因为这里的所有答案(最近两个月)建议使用(我的观点)非常复杂的SwingWorker解决方法与简单的Runnable#线程相比,使用普通的invokeLater,+1 – mKorbel 2012-04-28 16:42:31
我的答案不如robin或mprabhat,虽然它们都更加全面并且涉及OP的其他方面的问题。我想在几分钟内删除这个答案。 – 2012-04-28 16:45:08