首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ProgressMonitor不工作

Java ProgressMonitor不工作
EN

Stack Overflow用户
提问于 2012-07-21 16:07:00
回答 3查看 7.3K关注 0票数 1

我的代码不工作,谁能告诉我为什么?也请改正我的代码,我对Java非常陌生。除此之外,我正在搜索“加载面板组件”,类似于ProgressMonitor,但可能更有吸引力,动画效果更好。如果有人用过这样的东西,请推荐给我。

代码语言:javascript
复制
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);
    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-21 17:00:34

正如@Mark Rotteveel已经指出的,您将保持EDT (Event Dispatch Thread)被占用。关于'How to show progress bars/monitors'的教程包含有价值的信息和代码示例。

但从根本上说,这需要将计算转移到工作线程(例如,使用SwingWorker),并在EDT上显示ProgressMonitor。它由工作线程来向ProgressMonitor指示已经取得了什么进展。

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

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

票数 8
EN

Stack Overflow用户

发布于 2012-07-21 16:11:02

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

所以你需要把for循环移出event-thread。

票数 5
EN

Stack Overflow用户

发布于 2012-07-21 17:01:52

1.认为这是经验法则,UI在UI线程上工作,非UI在非UI线程上工作。

事件分派器线程()在这里是UI线程,因此您应该将非UI进程密集型工作放在EDT之外的单独线程上。

3.您可以通过两种方式完成此操作.....

i.创建一个独立的线程来完成此操作。

ii.使用SwingWorker来同步非UI和UI线程。

4.始终保留main()方法,仅用于使JFrame在EDT中可见。

例如:

代码语言:javascript
复制
public static void main(String[] args){

       EventQueue.invokeLater(new Runnable(){

         public void run(){

             myframe.setVisible(true);

            }
         }
      }

查看此站点以获取SwingWorker的工作示例:

http://www.kodejava.org/examples/381.html

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11590537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档