2

我一直在阅读有关 Java 并发以及 Java Swing GUI 特有的多线程技术的介绍性材料。我目前不确定对我的情况使用的最佳方法是什么。我的情况如下:

我正在开发一个程序,其中一个功能是在用户停留在特定的 GUI 屏幕上时,使用来自语音识别 API 的代码来收听用户的语音。语音识别检测到的每个单词都会实时添加到 UI 上的 Java Swing 文本字段中。将检测到的每个单词都添加到文本字段中也很重要,因此语音识别线程一直运行直到用户选择退出非常重要。

我的代码当前包含在专用类的方法中。

public class VoiceRecognitionCore 
{

    public void RunVoiceRegonition() throws VoiceRecognitionException
    {
          //Voice recognition code here
    }
}

什么是让这个线程持续运行的最有效和最安全的方法,我怎样才能让它访问 UI 上的文本字段。

感谢您的时间

4

2 回答 2

3

一种可能的解决方法是在单独的线程上运行您的语音识别,然后,当您需要更新您的 GUI 时,只需使用SwingUtilities.invokeLater(Runnable runnable)更新您的 GUI。

于 2013-01-24T10:19:26.043 回答
3

我会建议你看看SwingWorkers 这里

从 docs.oracle.com 的页面:

SwingWorker provides a number of communication and control features:

•The SwingWorker subclass can define a method, done, which is automatically invoked on the event dispatch thread when the background task is finished.

•SwingWorker implements java.util.concurrent.Future. This interface allows the background task to provide a return value to the other thread. Other methods in this interface allow cancellation of the background task and discovering whether the background task has finished or been cancelled.

•The background task can provide intermediate results by invoking SwingWorker.publish, causing SwingWorker.process to be invoked from the event dispatch thread.

•The background task can define bound properties. Changes to these properties trigger events, causing event-handling methods to be invoked on the event dispatch thread.

于 2013-01-24T10:25:52.327 回答