模态 JDialog 不更新
modal JDialog not updating
我的模态 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);
您使用线程和 SwingUtilities.invokeLater() 不正确。
线程的目的是在单独的线程中执行较长的 运行ning 任务(您的文件下载),这样您就不会阻塞 Event Dispatch Thread (EDT)
。
SwingUtilities.invokeLater() 的要点是向 EDT 添加代码。
因此在您的情况下,您将文件下载代码添加到 EDT,这意味着 GUI 无法响应事件或重新绘制自身,直到所有文件下载完成。
您希望线程 运行 下载代码,然后在每个文件下载完成后创建一个 SwingUtilities.invokeLater(...) 来更新栏和标签。
最简单的方法是在结果可用时使用 SwingWorker
和 publish()
结果。
阅读有关 Concurrency 的 Swing 教程部分,了解更多信息和 SwingWorker
的工作示例。
我的模态 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);
您使用线程和 SwingUtilities.invokeLater() 不正确。
线程的目的是在单独的线程中执行较长的 运行ning 任务(您的文件下载),这样您就不会阻塞 Event Dispatch Thread (EDT)
。
SwingUtilities.invokeLater() 的要点是向 EDT 添加代码。
因此在您的情况下,您将文件下载代码添加到 EDT,这意味着 GUI 无法响应事件或重新绘制自身,直到所有文件下载完成。
您希望线程 运行 下载代码,然后在每个文件下载完成后创建一个 SwingUtilities.invokeLater(...) 来更新栏和标签。
最简单的方法是在结果可用时使用 SwingWorker
和 publish()
结果。
阅读有关 Concurrency 的 Swing 教程部分,了解更多信息和 SwingWorker
的工作示例。