当前位置: 首页 > 面试题库 >

从可运行文件更新GUI

蒋泰
2023-03-14
问题内容

我正在构建一个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,结果一切都运