Java ProgressMonitor无法正常工作

GMs*_*soF 1 java swing swingworker jprogressbar progressmonitor

我的代码如下不起作用,谁能告诉我为什么?还请更正我的代码,我是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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Rob*_*bin 8

正如@Mark Rotteveel已经指出的那样,你保持EDT(事件调度线程)被占用."如何显示进度条/监视器"教程包含有价值的信息和代码示例.

但基本上它归结为将计算移动到工作线程(例如使用a SwingWorker),并ProgressMonitor在EDT上显示.由工作者线程决定ProgressMonitor已经取得了什么进展.

这里是直接链接到该教程,清楚地显示了工作是如何在做的示例代码SwingWorker扩展(在Task该示例类),以及如何ProgressMonitor被加入了更新PropertyChangeListenerSwingWorker,那里的听众传递进度这个ProgressMonitor.

我还建议阅读Swutch中Concurrency教程,其中包含有关如何Thread结合Swing 处理s的更多信息,以及为什么你不能/不应该在EDT上进行繁重的计算


Mar*_*eel 5

在Swing中,事件线程是修改和更新GUI的内容.您正在使事件线程忙于for-loop和sleep,因此它无法更新GUI.你在事件线程上做的所有事情都应该是短暂的.其他所有东西都应该从事件线程中移除.

所以你需要将for循环移出事件线程.