我的代码不工作,谁能告诉我为什么?也请改正我的代码,我对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);
}
}发布于 2012-07-21 17:00:34
正如@Mark Rotteveel已经指出的,您将保持EDT (Event Dispatch Thread)被占用。关于'How to show progress bars/monitors'的教程包含有价值的信息和代码示例。
但从根本上说,这需要将计算转移到工作线程(例如,使用SwingWorker),并在EDT上显示ProgressMonitor。它由工作线程来向ProgressMonitor指示已经取得了什么进展。
here是该教程的示例代码的直接链接,它清楚地展示了如何在SwingWorker扩展(该示例中的Task类)中完成工作,以及如何通过将PropertyChangeListener添加到SwingWorker来更新ProgressMonitor,其中侦听器将进度传递给ProgressMonitor。
我还建议阅读Concurrency in Swing教程,其中包含有关如何结合Swing处理Thread的更多信息,以及为什么不能/不应该在EDT上进行繁重的计算
发布于 2012-07-21 16:11:02
在Swing中,事件线程负责修改和更新GUI。您使事件线程忙于该for循环和休眠,因此它无法更新GUI。你在事件线程上做的所有事情都应该是短暂的。所有其他的东西都应该从事件线程中移出。
所以你需要把for循环移出event-thread。
发布于 2012-07-21 17:01:52
1.认为这是经验法则,UI在UI线程上工作,非UI在非UI线程上工作。
事件分派器线程()在这里是UI线程,因此您应该将非UI进程密集型工作放在EDT之外的单独线程上。
3.您可以通过两种方式完成此操作.....
i.创建一个独立的线程来完成此操作。
ii.使用SwingWorker来同步非UI和UI线程。
4.始终保留main()方法,仅用于使JFrame在EDT中可见。
例如:
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
myframe.setVisible(true);
}
}
}查看此站点以获取SwingWorker的工作示例:
http://www.kodejava.org/examples/381.html
https://stackoverflow.com/questions/11590537
复制相似问题