【问题标题】:Progress Bar Java进度条 Java
【发布时间】:2013-02-18 09:29:32
【问题描述】:

我正在使用 JProgressBar 来显示进度。但是,如何将进度条显示为从 0 加载到 100?我从互联网上得到了代码,它的工作除了没有加载进度条。

代码

progressFrame = new JFrame(); // frame to display progress bar
progressBar = new JProgressBar(0,100);
progressBar.setValue(0);
progressBar.setStringPainted(true);
progressFrame.add(progressBar);

new SwingWorker<Void,Void>()
    {
        protected Void doInBackground() throws SQLException, ClassNotFoundException
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            progressBar.setValue(0);
            frame.setEnabled(false); // frame = main frame

            //tableclass creates a JTable with data from database
            tableclass = new TheDatabaseTable(deptName);//it takes time to create
            progressBar.setValue(50);
            frame.getContentPane().removeAll();
            frame.setContentPane(tableclass);

            frame.validate();
            frame.repaint();

            progressBar.setValue(100);
            //progressFrame.dispose();
            return null;
        }; 
        protected void done()
        {
            //progressFrame.setVisible(false);
            frame.setVisible(true);
            progressFrame.dispose();
            frame.setEnabled(true);
        }

    }.execute();

如果有人编辑上述代码以使其工作,我将不胜感激。谢谢。

【问题讨论】:

  • this answer。覆盖process,并在该方法内设置进度条的值。要更新它,请在 doInBackground 方法中调用 publish

标签: java swing jtable jprogressbar tablecelleditor


【解决方案1】:
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class ProgressBar {
    /**
     * JProgressBar
     * 
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame("New Window");
        frame.setSize(600, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setLayout(new GridBagLayout());
        frame.setVisible(true);

        //JLabel textLoad = new JLabel();
        //textLoad.setText("Loading ....");

        JProgressBar progressBar = new JProgressBar();        
        progressBar.setMinimum(0);
        progressBar.setMaximum(100);
        progressBar.setStringPainted(true);
        progressBar.setIndeterminate(true);
        frame.add(progressBar);                               

        for (int i = progressBar.getMinimum(); i <= progressBar.getMaximum(); i++) {
            Thread.sleep(500);
            progressBar.setValue(i);
        }

        textLoad.setText("Done !");
    }

}

【讨论】:

  • 请为您的答案提供一些评论,而不仅仅是代码。
【解决方案2】:
/*
By
Dr. Amit Kumar Kapoor
Assistant Professor, Maharaja Agrasen Institute of Management & Technology, Jagadhri
E-mail ID: akbrightfuture@gmail.com
*/
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    class progressbardemo extends JFrame implements ActionListener
       {
          JProgressBar pb;
          JButton b1;
              progressbardemo()
              {
                 super("Progressbar");
                 setLayout(null);
                 b1=new JButton("Click");
                 b1.setBackground(Color.yellow);             
                 pb=new JProgressBar(1,100);
                 pb.setValue(0);
                 pb.setStringPainted(true);
                 pb.setForeground(Color.red);   
                 pb.setBackground(Color.white); 
                 b1.setBounds(20,20,80,25);pb.setBounds(110,20,200,25);
                 pb.setVisible(false);
                 add(b1);
                 add(pb);             
                 b1.addActionListener(this);
                 setResizable(false);
                 setDefaultCloseOperation(EXIT_ON_CLOSE);
              }
               public void actionPerformed(ActionEvent e)
               {
                  int i=0;
                  if(e.getSource()==b1)
                     {
                       pb.setVisible(true);
                    try
                    {
                       while(i<=100)
                       {
                        Thread.sleep(50);
        pb.paintImmediately(0, 0, 200, 25);
            pb.setValue(i);
                         i++;
        }
                     }
                     catch(Exception e1)
                     {
        System.out.print("Caughted exception is ="+e1);
                     }
                    }
               }
              public static void main(String arg[])
              {
              progressbardemo m=new progressbardemo();
              m.setSize(330,100);
              m.setVisible(true);
              Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
              int x = (int) ((dimension.getWidth() - m.getWidth()) / 2);
              int y = (int) ((dimension.getHeight() - m.getHeight()) / 2);
              m.setLocation(x, y); 
              }
       }

【讨论】:

  • 请停止在整个网站上传播您的次优代码,已经在您之前的答案中指出了需要修复的问题 ;-) 无论如何,即使已修复,也不鼓励发布完全相同的答案重复:可能是副本不适合问题,或者问题是重复的(应该这样标记)
【解决方案3】:

您必须为此使用线程。设计一个实现Runnable 接口的类,它将像这样更新值。

class ProgressBarUpdator implements java.lang.Runnable {

    /**
     * Progress bar that shows the current status
     */
    private javax.swing.JProgressBar jpb = null;
    /**
     * Progress bar value
     */
    private java.lang.Integer value = null;

    /**
     * Constructor
     * @param jpb The progress bar this has to update
     */
    public ProgressBarUpdator(javax.swing.JProgressBar jpb) {
        this.jpb = jpb;
        jpb.setMaximum(100);
    }

    /**
     * Sets the value to the progress bar
     * @param value Value to set
     */
    public void setValue(java.lang.Integer value) {
        this.value = value;
    }

    /**
     * Action of the thread will be executed here. The value of the progress bar will be set here.
     */
    public void run() {
        do {
            if (value != null) {
                jpb.setValue((int)java.lang.Math.round(java.lang.Math.floor(value.intValue() * 100 / maximum)));
            }
            try {
                java.lang.Thread.sleep(100L);
            } catch (java.lang.InterruptedException ex) {
                ex.printStackTrace();
            }
        } while (value == null || value.intValue() < jpb.getMaximum());
    }
}

在你的框架类中使用progressBar 和这样的新类

ProgressBarUpdator ju = new ProgressBarUpdator(progressBar);
new java.lang.Thread(ju).start();

只要你想改变值,只需使用语句

ju.setValue([Value to set]);

【讨论】:

  • 能否请您告诉我要为最大值初始化什么=?在 run() 方法中,谢谢。
  • 这是进度条最大值。您可以将其设置为 100,例如 jpb.setMaximum(100);。这已经在构造函数中可用。检查一次。
  • -1 永远不要从事件调度线程之外创建/更新任何 Swing 组件。 Swing 使用单线程模型。见Concucurrneyc in Swing。这是原始问题的问题之一
  • @MadProgrammer 好的。也会研究这种方法。我确实像这样编写我的程序并且它们运行顺利。
  • @RavindraGullapalli 问题源于 Swing 不是线程安全的(没有同步)。因为您不控制绘制过程,所以当您更新模型时,重绘管理器可能会尝试重新绘制,这意味着您最终可能会得到脏漆。我继承了 3 年的应用程序以这种方式完成了很多代码,在这 3 年期间,通过确保所有 UI更新在 EDT 内执行
【解决方案4】:

一定喜欢来自互联网的代码...哦...

您的代码违反了 Swing 的单线程规则,因此是一个不好的例子。

SwingWorker 有多种选择。您可以publish 进度并使用process 方法更新进度条,或者您可以使用PropertyChangeListener 并监视通过调用SwingWorkersetProgress 方法创建的进度更改事件

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class SwingWorkerProgress {

    public static void main(String[] args) {
        new SwingWorkerProgress();
    }

    public SwingWorkerProgress() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JProgressBar pbProgress;
        private JButton start;

        public TestPane() {

            setBorder(new EmptyBorder(10, 10, 10, 10));
            pbProgress = new JProgressBar();
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(4, 4, 4, 4);
            gbc.gridx = 0;
            gbc.gridy = 0;
            add(pbProgress, gbc);

            start = new JButton("Start");
            gbc.gridy++;
            add(start, gbc);

            start.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    start.setEnabled(false);
                    ProgressWorker pw = new ProgressWorker();
                    pw.addPropertyChangeListener(new PropertyChangeListener() {

                        @Override
                        public void propertyChange(PropertyChangeEvent evt) {
                            String name = evt.getPropertyName();
                            if (name.equals("progress")) {
                                int progress = (int) evt.getNewValue();
                                pbProgress.setValue(progress);
                                repaint();
                            } else if (name.equals("state")) {
                                SwingWorker.StateValue state = (SwingWorker.StateValue) evt.getNewValue();
                                switch (state) {
                                    case DONE:
                                        start.setEnabled(true);
                                        break;
                                }
                            }
                        }

                    });
                    pw.execute();
                }
            });

        }
    }

    public class ProgressWorker extends SwingWorker<Object, Object> {

        @Override
        protected Object doInBackground() throws Exception {
            int i = 0;
            int max = 2000;

            while (i < max) {
                i += 10;
                int progress = Math.round(((float)i / (float)max) * 100f);
                setProgress(progress);
                try {
                    Thread.sleep(25);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            return null;
        }
    }
}

【讨论】:

  • 为避免object和int之间出现不可转换的类型异常,替换行,“int progress = (int) evt.getNewValue();” with "int progress = ((Integer) evt.getNewValue()).intValue();"
  • @AVA 为什么?它是自动装箱的
  • 对不起,请忽略!我在 1.6.0_16 版本中遇到了异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2015-08-11
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多