没有JButton和PropertyChangeListener的JProgressBar [英] JProgressBar without JButton and PropertyChangeListener

查看:91
本文介绍了没有JButton和PropertyChangeListener的JProgressBar的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 JProgressBar 的新手,也是OOP概念的新手(学习它)并阅读了很多文章,并尽力学习它。显示的所有示例都有一个按钮,可以在其中开始进度,但是如何创建方法以便在调用方法时它开始进度?

I am new to JProgressBar and new to OOPs concepts as well (learning it) and read a lot of articles and tried my best to learn it. All of the examples shown had a button which starts progress in it but how can I make a method so that when the method is called it starts progress?

这是我的代码第一个

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()方法时,c $ c>没有收听。如何才能调用 ExecuteTask()并执行任务并且jProgressBar会监听它?

My jProgressBar is not listening when I call ExecuteTask() method. How can I make it to call ExecuteTask() and it execute task and jProgressBar listen to it?

推荐答案

您永远不会将PropertyChangeListener添加到任何内容中,因此没有任何内容正在侦听SwingWorker的更改,因此其更改永远不会传输到JProgressBar。解决方案:在创建后将PropertyChangeListener添加到SwingWorker。事实上 - 你 没有PropertyChangeListener,只是一个方法借用你没有使用的方法(??)。

You never add your PropertyChangeListener to anything, and so since nothing is listening for changes to the SwingWorker, its changes never get transmitted to the JProgressBar. Solution: add the PropertyChangeListener to the SwingWorker after making it. And in fact -- you have no PropertyChangeListener, just a method borrowed from one that you didn't use (??).

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

Other issues: learn OOPs, at least the rudiments before learning Swing. You should not be using static fields as you're doing here.

一些不错的链接:

  • Cant get JProgressBar to update from SwingWorker class
  • Understanding Java ExecutorService: a recent favorite of mine.
  • JProgressBar not working properly: check MadProgrammer's several links. He's a pro at this and pretty much anything Swing

sigh

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();
   }
}

这篇关于没有JButton和PropertyChangeListener的JProgressBar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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