我的以下代码无法正常工作,有人可以告诉我为什么吗?还请更正我的代码,我对Java还是很陌生。除此之外,我还在搜索“加载面板组件”,类似于ProgressMonitor
,但可能更具吸引力,并且动画效果更好。如果有人曾经使用过这种东西,请给我建议。
public class Main extends JFrame {
private JPanel contentPane;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Main frame = new Main();
frame.setVisible(true);
ProgressMonitor pm = new ProgressMonitor(frame, "Loading...",
"waiting...",
0, 100000);
for (int i = 0 ; i < 100000 ; i ++){
pm.setProgress(i);
pm.setNote("Testing");
System.out.println(i);
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Main() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
}
}
最佳答案
正如@Mark Rotteveel所指出的那样,您正在占用EDT(事件调度线程)。 'How to show progress bars/monitors'上的教程包含有价值的信息和代码示例。
但基本上归结为将计算移至工作线程(例如使用SwingWorker
),并在EDT上显示ProgressMonitor
。由工作线程负责向ProgressMonitor
指示已经取得了什么进展。
而here是该教程示例代码的直接链接,该示例代码清楚地显示了如何在SwingWorker
扩展名(该示例中的Task
类)中完成工作,以及如何通过添加来更新ProgressMonitor
PropertyChangeListener
到SwingWorker
,侦听器将进度传递给ProgressMonitor
。
我还建议阅读Concurrency in Swing教程,该教程包含有关如何与Swing一起处理Thread
的更多信息,以及为什么不能/不应该在EDT上进行大量计算
关于java - Java ProgressMonitor无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11590537/