如何从Thread更新java GUI? [英] How to update java GUI from Thread?

查看:116
本文介绍了如何从Thread更新java GUI?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 private void StartActionPerformed(java.awt.event.ActionEvent evt) {

        Queue queue=new Queue();
        int target=Integer.parseInt(Target.getText());
        String path=Path.getText();
        final Producer p=new Producer(queue, target);
        Consumer c=new Consumer(queue);
        p.start();
        c.start();

        while(p.finish !=true)
        {
          Runnable r = new Runnable() {
            public void run() {
              ProgressPrecent.setValue(Producer.ProgressPercent);
            }
          };
          if(EventQueue.isDispatchThread()) {
            r.run();
          }
          else {
            EventQueue.invokeLater(r);
          }
       }
 }

我有两个课程共享队列。其中一个是Producer,它生成直到一个目标,另一个消耗这些元素。所有两个都扩展了Thread。我想向用户显示进度百分比,但它会冻结我的GUI,所以我该怎么办?

I have two classes that have a shared Queue. one of them is Producer that produces till a target other one consume those elements. all of two extends Thread. I want to display the progress percent to the user, but it freeze my GUI so what should I do?

推荐答案


  • 工人主题默认永远不会调用 EventDispatchThread ,你有 Swing中的Concurency

    • Worker Threads by default never to invoked EventDispatchThread, you have issue with Concurency in Swing

      对Swing的所有更新GUI必须在EDT上完成

      all updates to Swing GUI must be done on EDT

      Runnable 可能是正确的方式,但 ProgressPrecent .setValue(Producer.ProgressPercent); 必须包装在 invokeLater

      Runnable could be proper way but ProgressPrecent.setValue(Producer.ProgressPercent); must be wrapped in invokeLater

      代码

      SwingUtilities.invokeLater(new Runnable(){
          public void run(){
              ProgressPrecent.setValue(Producer.ProgressPercent);
          }
      }); 
      




      • 删除EDT测试,

      • 代码行

        if(EventQueue.isDispatchThread()) {
           r.run();
        }
        

        工人线程 by defaut永远不会调用EDT,然后从EDT启动无关紧要,也不测试 isDispatchThread()不会让我有所作为

        Workers Thread by defaut never ever to invoke EDT, then doesn't matter if is started from EDT, nor tested for isDispatchThread() doesn't make me some sence


        • 永远不要在<$ c里面使用 Thread.sleep(int ) $ c> Swing Listeners ,因为导致了Swing GUI的崩溃

        • never ever, don't to use Thread.sleep(int) inside Swing Listeners, because caused freeze Swing GUI too

        我认为你可以使用这个职位的工作者也是

        这篇关于如何从Thread更新java GUI?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆