Java 模态JDialog未更新

Java 模态JDialog未更新,java,jdialog,Java,Jdialog,我的模态JDialog有点问题。我希望它在代码在后台运行(下载一些文件)和更新对话框时显示,以便用户可以看到当前状态。下载很好,但不更新对话框。。。帮助我!我找不到我的错误c 代码段: JDialog dialog = new JDialog(parentFrame, "Element download...", true); dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); dialog.setResizable(fal

我的模态JDialog有点问题。我希望它在代码在后台运行(下载一些文件)和更新对话框时显示,以便用户可以看到当前状态。下载很好,但不更新对话框。。。帮助我!我找不到我的错误c

代码段:

JDialog dialog = new JDialog(parentFrame, "Element download...", true);
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dialog.setResizable(false);
dialog.getContentPane().setLayout(new BorderLayout());

JPanel panel = new JPanel();
panel.setBorder(new EmptyBorder(5, 5, 5, 5));
panel.setPreferredSize(new Dimension(300, 100));
panel.setLayout(null);
dialog.add(panel);

final JLabel label = new JLabel("Starting download...");
label.setBounds(new Rectangle(0, 0, 300, 20));
label.setHorizontalTextPosition(JLabel.CENTER);
panel.add(label);

final JProgressBar bar = new JProgressBar(0, 118);
bar.setBounds(new Rectangle(20, 0, 300, 80));
panel.add(bar);

dialog.pack();
dialog.setLocationRelativeTo(parentFrame);

new Thread(new Runnable() {
    @Override
    public void run() {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                // Executin some code (that works fine)
                bar.setValue(value);  
                label.setText(text);
                System.out.println(text);
                dialog.dispose();
            }
        });
    }
}).start();
dialog.setVisible(true);

您正在错误地使用Thread和SwingUtilities.invokeLater()

线程的要点是在单独的线程中执行长时间运行的任务(您的文件下载),这样您就不会阻止
事件调度线程(EDT)

invokeLater()的要点是向EDT添加代码

因此,在您的例子中,您正在将文件下载代码添加到EDT,这意味着在所有文件下载完成之前,GUI无法响应事件或重新绘制自身

您希望线程运行下载代码,然后在下载完每个文件后,创建一个SwingUtilities.invokeLater(…)来更新条和标签

最简单的方法是使用
SwingWorker
publish()
在结果可用时对其进行编辑


阅读Swing教程中关于的部分,以了解有关
SwingWorker

的更多信息和工作示例,下载文件的代码在哪里?线程中的所有代码都在事件分派线程上执行。此外,在启动线程之前,应该使JDialog可见。为什么需要代码?我把它剪掉了,因为它很长。如果我在执行线程之前将JDialog设置为可见,则在对话框关闭之前不会执行线程,因为JDialog会阻止任何其他操作。