首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JProgressBar无JButton和PropertyChangeListener

JProgressBar无JButton和PropertyChangeListener
EN

Stack Overflow用户
提问于 2014-09-23 22:03:14
回答 1查看 321关注 0票数 1

我是JProgressBar的新手,也是OOPs概念的新手(学习它),读了很多文章,并尽我最大的努力学习它。所有显示的示例都有一个按钮,该按钮在其中启动进度,但我如何才能创建一个方法,以便在调用该方法时启动进度?

这是我的代码

代码语言:javascript
复制
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

public class ProgressDemo
{
    JProgressBar ProgressBar;
    Task task;
    boolean done = false;

    class Task extends SwingWorker<Void, Void> 
    {
        @Override
        public Void doInBackground() 
        {
            Random random = new Random();
            int progress = 0;
            setProgress(0);
            while (progress < 100) 
            {
               try 
               {
                    Thread.sleep(random.nextInt(1000));
               } 
               catch (InterruptedException ignore){}
               progress += random.nextInt(10);
               setProgress(Math.min(progress, 100));
            }
            return null;
        }
        @Override
        public void done() 
        {
            done = true;
        }
    }

    public void propertyChange(PropertyChangeEvent evt) 
    {
      if(!done)
      {
        int progress = task.getProgress();
        if(progress==0)
        {
            ProgressBar.setIndeterminate(true);
        }
        else
        {
            ProgressBar.setIndeterminate(false); 
            ProgressBar.setString(null);
            ProgressBar.setValue(progress);
        }
      }
    }

    //I want to make a method here, so that it can be called when ever I want
    public void ExecuteTask()
    {
        task = new Task();
        task.execute();
    }

    public static void main(String[] args) 
    {
        JFrame MainScreen = new JFrame(); 
        JPanel MainPanel = new JPanel();
        ProgressBar = new JProgressBar(0, 100);
        ProgressBar.setValue(0);
        ProgressBar.setStringPainted(false);
        MainPanel.add(ProgressBar);
        MainScreen.getContentPane().add(MainPanel);
        MainScreen.setVisible(true);
    }
}

我的jProgressBar在调用ExecuteTask()方法时没有监听。如何让它调用ExecuteTask()并执行任务,并让jProgressBar侦听它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-23 22:13:58

您从不将您的PropertyChangeListener添加到任何东西中,因此由于没有任何东西侦听对SwingWorker的更改,所以它的更改永远不会被传输到JProgressBar。解决方案:在创建PropertyChangeListener后将其添加到SwingWorker中。事实上-- no PropertyChangeListener,只是从没有使用的方法中借用了 (??)。

其他问题:学习OOPs,至少是学习Swing之前的基本知识。您不应该像在这里一样使用静态字段。

一些像样的链接:

叹息

代码语言:javascript
复制
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Random;
import java.util.concurrent.ExecutionException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.Timer;

@SuppressWarnings("serial")
public class ProgressDemo extends JPanel {
   private JProgressBar progressBar = new JProgressBar(0, 100);
   private Task task;
   boolean done = false;

   public ProgressDemo() {
      progressBar.setStringPainted(true);
      progressBar.setIndeterminate(true);
      add(progressBar);
   }

   class Task extends SwingWorker<Void, Void> {
      @Override
      public Void doInBackground() {
         Random random = new Random();
         int progress = 0;
         setProgress(0);
         while (progress < 100) {
            try {
               Thread.sleep(random.nextInt(1000));
            } catch (InterruptedException ignore) {
            }
            progress += random.nextInt(10);
            setProgress(Math.min(progress, 100));
         }
         return null;
      }

      @Override
      public void done() {
         done = true;
      }
   }

   private class TaskListener implements PropertyChangeListener {
      @Override
      public void propertyChange(PropertyChangeEvent evt) {
         if ("progress".equals(evt.getPropertyName())) {
            int progress = task.getProgress();
            progressBar.setIndeterminate(false);
            progressBar.setString(null);
            progressBar.setValue(progress);
         }
         if (SwingWorker.StateValue.DONE == evt.getNewValue()) {
            // always need to know when the SW is done
            // so we can call get() and trap exceptions
            try {
               task.get();
            } catch (InterruptedException | ExecutionException e) {
               e.printStackTrace();
            }
         }
      }
   }

   // I want to make a method here, so that it can be called when ever I want
   public void executeTask() {
      task = new Task();
      task.addPropertyChangeListener(new TaskListener());
      task.execute();
   }

   public static void main(String[] args) {
      JFrame mainScreen = new JFrame();
      mainScreen.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      final ProgressDemo demoPanel = new ProgressDemo();

      mainScreen.getContentPane().add(demoPanel);
      mainScreen.pack();
      mainScreen.setLocationByPlatform(true);
      mainScreen.setVisible(true);

      // just for yucks, let's wait 3 seconds before calling executeTask()
      int delay = 3 * 1000;
      new Timer(delay, new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            demoPanel.executeTask();

            // stop timer
            ((Timer) e.getSource()).stop();
         }
      }).start();
   }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26005435

复制
相关文章

相似问题

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