【问题标题】:Running UI thread indefinitely无限期运行 UI 线程
【发布时间】:2013-02-26 08:14:09
【问题描述】:

我正在使用 Java Swing 编写一段代码。基本上它的作用是处理一些冗长的任务。在任务运行时,我希望有一个等待弹出窗口,其中包含 GIF 图像。

我的问题是

        final InfoDialog infoDialog = new InfoDialog("Parsing file: " + fileToBeUploaded.getName());

        final File finalFileToBeUploaded = fileToBeUploaded;

        class FileParsingWorker extends SwingWorker<Void, String> {            
            @Override
            protected Void doInBackground() throws Exception {
                String text = fileParsers.parseFile(finalFileToBeUploaded);
                publish(text);
                return null;
            }

            @Override
            protected void process(List<String> chunks) {
                infoDialog.setVisible(false);
            }
        }

        infoDialog.setVisible(true);
        FileParsingWorker fileParsingWorker = new FileParsingWorker();
        fileParsingWorker.execute();

InfoDialog 是一个小的 UI 弹出窗口,其中包含 GIF 动画。基本上,我将冗长的任务放在工作人员中,但将 UI 的 setVisibles 放在两个地方。我在想是否有什么方法可以在线程中运行 InfoDialog UI,以便我可以重用那段代码?

我的问题是我想无限期地运行 InfoDialog,直到我故意停止它。如果我将 setVisible(true) 放在一个线程中,该线程会立即终止,并且我的 UI 将不会更新。

谁能教我怎么做?

【问题讨论】:

  • 你在哪里设置对话框可见?

标签: java swing jdialog swingworker


【解决方案1】:

请阅读Concurrency in Swing,特别是The Event Dispatch Thread。这是应该在其上创建和操作所有 Swing 组件的线程。即:

SwingUtilities.invokeLater(new Runnable () {
    @Override
    public void run() { 
        final InfoDialog infoDialog = new InfoDialog("Parsing file: " + fileToBeUploaded.getName());

        final File finalFileToBeUploaded = fileToBeUploaded;

        ...

        infoDialog.setVisible(true);
        FileParsingWorker fileParsingWorker = new FileParsingWorker();
        fileParsingWorker.execute();
    }
});

另外我认为另一个问题是你将 dialog 设置回在 Swing 工作程序的覆盖 process(List&lt;String&gt; chunks) 中不可见,因此在读取第一个块时,dialog 将被关闭。我认为 Swing Workers done() 方法可能更符合您的要求,并且它在 EDT 上执行:

class FileParsingWorker extends SwingWorker<Void, String> {            
    @Override
    protected Void doInBackground() throws Exception {
        String text = fileParsers.parseFile(finalFileToBeUploaded);
        publish(text);
        return null;
    }

    @Override
    protected void process(List<String> chunks) {
      //each chunk will get processed here
    }

    @Override
    protected void done() {//when Swing worker is finished this method is called
        infoDialog.setVisible(false);
    }
}

【讨论】:

  • +1 - 只是吹毛求疵:只要 publish 只被调用一次,没关系:-)
猜你喜欢
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2016-01-16
  • 2010-12-06
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多