繁体   English   中英

JProgressBar实例化自己多次

[英]JProgressBar instantiate it self multiple time

我试图将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();
            }   
        }
    }
}

}

我做错了什么主意吗?

您正在paintComponent(Graphics g)方法内部调用bar() 此方法负责绘制组件,并且可能被调用多次,而不在您的控件中。 不要这样做,而应该在构造函数或其他只能调用一次的位置调用一次。

您还需要从Swing事件线程中设置JProgressBar的值,这样做可能很危险。 请改用Swing计时器,或将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();
         }
      });
   }
}

您正在创建JProgressBar并将其添加到您的类Open中,方法为paintComponent()。 每次都调用paintComponent()时,组件需要自行绘制。

可以在调整窗口(JFrame)或其他与您的应用程序重叠的应用程序的大小之后。

您应该将初始化移动到Opening的构造函数中。

参见http://docs.oracle.com/javase/tutorial/uiswing/painting/closer.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM