首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从runnable更新GUI

从runnable更新GUI
EN

Stack Overflow用户
提问于 2012-04-29 00:29:23
回答 3查看 4.9K关注 0票数 2

我正在构建一个Swing应用程序,其中一个功能应该是以可视和可听的方式处理和输出一些文本(使用Mary TTS)。我需要一些关于GUI和文本处理类通信的最佳方式的建议。

GUI类是JPanel的子类。在其中,我有一个实现Runnable的类,名为LineProcesser,它准备要发送到音频播放器的文本。我使用线程执行器来避免EDT (这可能不是最好的方法,但它似乎达到了我想要的结果)。

我的目的是让LineProcessor遍历所有文本,并在每一行的末尾更新一个JTextArea。此外,它还需要在某些点上暂停并等待用户输入。在用户输入完成之后,GUI类应该告诉它继续处理。

下面的代码说明了我当前拥有的内容:

代码语言:javascript
运行
复制
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、属性/事件侦听器或其他什么?我读过的例子有点道理,但我不明白如何将它们应用到我这里的代码中。

EN

Stack Overflow用户

回答已采纳

发布于 2012-04-29 00:38:09

您所需要做的就是将任何Swing调用包装在Runnable中,并通过SwingUtilities.invokeLater(myRunnable);将其排队到EDT上。就这样。不需要SwingWorker。

例如,

代码语言:javascript
运行
复制
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 ***
        }
     });
  }
}
票数 6
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10365404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档