JProgressBar多次实例化它

Cha*_*hax 1 java swing jprogressbar

我正在尝试将JProgressBar添加到一个简单的程序中以便学习.到目前为止,我可以显示它,但它添加了多个实例,而我只想一个显示.在此输入图像描述

这是代码:

package package1;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class Opening extends JPanel {
    private JProgressBar loadingBar;
    private Thread t;

public void paintComponent(Graphics g)
{
    super.paintComponent(g);    
    //Loading bar
    bar();
}

private void bar()
{
    loadingBar = new JProgressBar();
    t = new Thread(new LoadMyBar());

    this.add(loadingBar).setLocation(25, 600);
    loadingBar.setSize(625, 25);
    loadingBar.setStringPainted(true);
    loadingBar.setValue(0);
    loadingBar.setMinimum(0);
    loadingBar.setMaximum(100);
    t.start();
}

class LoadMyBar implements Runnable
{
    public void run(){
        for(int i = loadingBar.getMinimum(); i <= loadingBar.getMaximum(); i++)
        {
            loadingBar.setValue(i);
            try
            {
                t.sleep(1000);
            }catch(InterruptedException e)
            {
                e.printStackTrace();
            }   
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

关于我做错了什么的任何想法?

Hov*_*els 5

你在调用方法bar()内部paintComponent(Graphics g).此方法负责绘制组件,可能会多次调用,而不是在您的控件中.不要这样做,而是在构造函数或其他可以只调用一次的位置调用一次.

您还要从Swing事件线程中设置JProgressBar的值,这可能很危险.使用Swing Timer或使用SwingWorker的progress属性和PropertyChangeListener.

例如,

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

@SuppressWarnings("serial")
public class Opening extends JPanel {
   private static final int TIMER_DELAY = 1000;
   private JProgressBar loadingBar;
   private Timer t = new Timer(TIMER_DELAY, new TimerListener());

   public Opening() {
      bar();
   }

   private void bar() {
      loadingBar = new JProgressBar();
      this.add(loadingBar);
      loadingBar.setStringPainted(true);
      loadingBar.setValue(0);
      loadingBar.setMinimum(0);
      loadingBar.setMaximum(100);
      t.start();
   }

   private class TimerListener implements ActionListener {
      int value = 0;

      @Override
      public void actionPerformed(ActionEvent e) {
         if (value <= 100) {
            loadingBar.setValue(value);
            value++;
         } else {
            // value > 100
            ((Timer) e.getSource()).stop(); // stop timer
         }
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("Opening");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(new Opening());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
Run Code Online (Sandbox Code Playgroud)