【问题标题】:modal JDialog not updating模态JDialog不更新
【发布时间】:2016-05-21 11:03:47
【问题描述】:

我的模态 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 中的所有代码都在 Event Dispatch 线程上执行。此外,您应该在启动线程之前使 JDialog 可见。
  • 为什么需要代码?我剪掉了,因为它很长。如果我在执行线程之前设置 JDialog 可见,则在对话框关闭之前不会执行线程,因为 JDialog 阻塞了任何其他操作。

标签: java jdialog


【解决方案1】:

您错误地使用了 Thread 和 SwingUtilities.invokeLater()。

线程的意义在于在单独的线程中执行长时间运行的任务(您的文件下载),这样您就不会阻塞Event Dispatch Thread (EDT)

SwingUtilities.invokeLater() 的重点是向 EDT 添加代码。

因此,在您的情况下,您将文件下载代码添加到 EDT,这意味着 GUI 无法响应事件或重新绘制自身,直到所有文件下载完成。

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

最简单的方法是在结果可用时使用SwingWorkerpublish()

阅读 Concurrency 上的 Swing 教程部分,了解更多信息和 SwingWorker 的工作示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多