1

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

}
4

3 回答 3

8

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

但基本上它归结为将您的计算移动到工作线程(例如使用 a SwingWorker),并ProgressMonitor在 EDT 上显示 。由工作线程指示ProgressMonitor已经取得的进展。

这里是该教程的示例代码的直接链接它清楚地显示了如何在SwingWorker扩展(该Task示例中的类)中完成工作,以及如何通过将 a 添加到 来ProgressMonitor更新,侦听器将进度传递到. _PropertyChangeListenerSwingWorkerProgressMonitor

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

于 2012-07-21T09:00:33.843 回答
5

在 Swing 中,事件线程负责修改和更新 GUI。您使事件线程忙于该 for 循环和睡眠,因此它无法更新 GUI。您在事件线程上所做的所有事情都应该是短暂的。其他所有内容都应移出事件线程。

因此,您需要将该 for 循环移出事件线程。

于 2012-07-21T08:11:01.693 回答
4

1.将此视为经验法则,UI 工作在 UI 线程上,非 UI 工作在非 UI 线程上

2. Event Dispatcher Thread (EDT) 是这里的 UI 线程,因此您应该将非 UI 进程密集型工作保持在 EDT 的单独线程 OUT 上

3.您可以通过两种方式做到这一点......

一世。创建一个单独的线程来执行此操作。

ii. 使用SwingWorker同步 Non-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

于 2012-07-21T09:01:52.423 回答