gpt4 book ai didi

java - JProgressBar 多次 self 实例化

转载 作者:行者123 更新时间:2023-11-29 07:01:06 25 4
gpt4 key购买 nike

我正在尝试将 JProgressBar 添加到一个简单的程序中,只是为了学习。到目前为止我可以显示它,但它添加了多个实例,而我只想显示一个。 enter image description here

代码如下:

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()。此方法负责绘制组件,可能会被多次调用,但不在您的控制范围内。不要那样做,而是在构造函数中调用一次,或者在其他只能调用一次的位置调用一次。

您还将 JProgressBar 的值设置为脱离 Swing 事件线程,这样做可能很危险。请改用 Swing 计时器或将 SwingWorker 的进度属性与 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();
}
});
}
}

关于java - JProgressBar 多次 self 实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26005082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com