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

我下面的代码不起作用,有人能告诉我为什么吗?请同时更正我的代码,我对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);
    }

}

在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);

            }
         }
      }