Java ProgressMonitor不工作
我下面的代码不起作用,有人能告诉我为什么吗?请同时更正我的代码,我对Java非常陌生。除此之外,我正在搜索加载面板组件,类似ProgressMonitor,但可能更吸引人,动画效果更好。如果有人以前用过这样的东西,请告诉我Java ProgressMonitor不工作,java,swing,swingworker,jprogressbar,progressmonitor,Java,Swing,Swingworker,Jprogressbar,Progressmonitor,我下面的代码不起作用,有人能告诉我为什么吗?请同时更正我的代码,我对Java非常陌生。除此之外,我正在搜索加载面板组件,类似ProgressMonitor,但可能更吸引人,动画效果更好。如果有人以前用过这样的东西,请告诉我 public class Main extends JFrame { private JPanel contentPane; public static void main(String[] args) { EventQueue.invok
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);
}
}
在Swing中,事件线程是修改和更新GUI的对象。您让事件线程忙于循环和睡眠,因此它无法更新GUI。在事件线程上执行的所有操作都应该是短期的。其他所有内容都应移出事件线程
因此,您需要将for循环移出事件线程。在Swing中,事件线程是修改和更新GUI的对象。您让事件线程忙于循环和睡眠,因此它无法更新GUI。在事件线程上执行的所有操作都应该是短期的。其他所有内容都应移出事件线程
因此,您需要将for循环从事件线程中移出。正如@Mark rotterveel已经指出的,您将保持EDT事件调度线程处于占用状态。关于的教程包含有价值的信息和代码示例 但基本上可以归结为将计算移动到工作线程,例如使用SwingWorker,并在EDT上显示ProgressMonitor。由工作线程向ProgressMonitor指示已经取得的进展 并且是该教程示例代码的直接链接,该示例清楚地显示了如何在SwingWorker扩展中完成该示例中的任务类中的工作,以及如何通过向SwingWorker添加PropertyChangeListener来更新ProgressMonitor,其中监听器将进度传递给ProgressMonitor
我还建议阅读教程,其中包含更多关于如何结合Swing处理线程的信息,以及为什么不能/不应该在EDT上进行大量计算的原因。正如@Mark Rotterveel已经指出的,您正在占用EDT事件调度线程。关于的教程包含有价值的信息和代码示例 但基本上可以归结为将计算移动到工作线程,例如使用SwingWorker,并在EDT上显示ProgressMonitor。由工作线程向ProgressMonitor指示已经取得的进展 并且是该教程示例代码的直接链接,该示例清楚地显示了如何在SwingWorker扩展中完成该示例中的任务类中的工作,以及如何通过向SwingWorker添加PropertyChangeListener来更新ProgressMonitor,其中监听器将进度传递给ProgressMonitor 我还建议阅读教程,其中包含了更多关于如何结合Swing处理线程的信息,以及为什么不能/不应该在EDT上进行繁重计算的信息。把它看作是经验法则,UI工作在UI线程上,非UI线程上的非UI工作。 二,。事件调度程序线程EDT是这里的UI线程,因此您应该将非UI进程密集型工作保留在EDT之外的单独线程上 三,。您可以通过两种方式完成此操作 一,。创建一个单独的线程来执行此操作 二,。使用SwingWorker同步非UI和UI线程 四,。始终只保留使JFrame在EDT中可见的主要方法 例如: 查看此站点,了解SwingWorker的工作示例: 一,。把它看作是经验法则,UI工作在UI线程上,非UI线程上的非UI工作。 二,。事件调度程序线程EDT是这里的UI线程,因此您应该将非UI进程密集型工作保留在EDT之外的单独线程上 三,。您可以通过两种方式完成此操作 一,。创建一个单独的线程来执行此操作 二,。使用SwingWorker同步非UI和UI线程 四,。始终只保留使JFrame在EDT中可见的主要方法 例如: 查看此站点,了解SwingWorker的工作示例:
请告诉我怎么做好吗?我在谷歌上搜索了一天,例子很复杂。。。请,一个简单的工作代码就可以了。@GMsoF&请告诉我怎么做?我在谷歌上搜索了一天,例子很复杂。。。请,一个简单的工作代码就可以了。@GMsoF&你的答案是最好的!汗水,经过长时间的尝试,我终于成功了。你的答案是最好的!经过长时间的尝试,我终于成功了。
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
myframe.setVisible(true);
}
}
}