我正在构建一个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如何通知GUI组件它们需要更改,以及如何在GUI中暂停和重新启动它?我是否需要Swing
Worker,属性/事件侦听器或其他工具感到困惑?我读过的例子很有道理,但是我看不到如何将它们应用于此处的代码。
您需要做的就是将所有Swing调用包装在Runnable中,然后通过将其排队在EDT上SwingUtilities.invokeLater(myRunnable);
。而已。不需要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应用程序。一旦开始运行,就会将api配置为.properties文件中设置的默认值。在运行状态下,可以更改api的配置,并应相应更新.properties文件。有办法实现吗?还是有其他方法可以实现这一目标? 提前致谢 问题答案: Java Properties类(api在此处)指定了应该正确执行的“ load”和“ store”方法。使用FileIn
当某个特定的文件更新后 Puppet 就该采取一些行动,这是一个非常常见的模式。 例如,在 rsync 配置片段的例子中,一旦修改了某个片段文件,就会调用 exec 资源更新主配置文件 rsyncd.conf。 每次运行 Puppet,exec 资源都会被运行,除非指定了如下参数中的一个: creates onlyif unless refreshonly => true refreshonly
我正在尝试动态更新主线程中的一个android。 不幸的是,我很难从网上的教程中找到任何东西。它们似乎都没有提供线程之间如何通信的完整图片。 我希望避免匿名类,只要有新消息,就动态创建新的。
终端中使用lldb运行可执行文件 进入lldb环境, 在终端内输入lldb回车 lldb 使用file命令, 将可执行文件包装成一个target (lldb) file test Current executable set to '/Users/shenyj/Documents/CodeForTest/staticOCLib/test' (x86_64). 运行可执行文件, 在刚刚的l
我试图写一个Java程序,它得到一个可执行文件运行在Linux下。此可执行文件接收两个参数,并使用这两个给定参数执行nmap-sp操作。 我将此文件称为file.exe,其内容如下: 我得到以下异常和错误日志: 线程“main”java.io.ioException中的异常:无法运行程序“file.exe”:error=2,在java.lang.runtime.exec(runtime.java:
我通过以下方式访问图像和文本文件: 如果有人能请我给我一步一步的解释,在哪里移动我的文件/更改我的代码,我将非常感谢。我看了很多其他线程,类路径/类加载器真的让我感到困惑。我试过一些 东西也有,但似乎都没有用。请帮忙,我有一个完成的程序和这最后一件事真的很沮丧,谢谢! 编辑1:所以我尝试了user2933977的建议,并将getResource更改为getResourceStream,结果一切都运