Java 模态JDialog未更新
我的模态JDialog有点问题。我希望它在代码在后台运行(下载一些文件)和更新对话框时显示,以便用户可以看到当前状态。下载很好,但不更新对话框。。。帮助我!我找不到我的错误c 代码段: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 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会阻止任何其他操作。