我的以下代码无法正常工作,有人可以告诉我为什么吗?还请更正我的代码,我对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 PropertyChangeListenerSwingWorker,侦听器将进度传递给ProgressMonitor

我还建议阅读Concurrency in Swing教程,该教程包含有关如何与Swing一起处理Thread的更多信息,以及为什么不能/不应该在EDT上进行大量计算

关于java - Java ProgressMonitor无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11590537/

10-10 15:40