gpt4 book ai didi

java - 我的 JProgressBar 在达到 100% 之前不会更新

转载 作者:搜寻专家 更新时间:2023-11-01 01:02:23 24 4
gpt4 key购买 nike

好的,我有下面的代码。

public class MyProgressBar extends JPanel implements MyData, Serializable {

/**
*
*/

public static final int MAX = 10000;
public static final int WIDTH = 400;
public static final int HEIGHT = 75;

private JProgressBar MyBar = new JProgressBar( SwingConstants.HORIZONTAL, 0, MAX );
private JFrame MyFrame = new JFrame();

private int MyValue = 0;

private Thread MyThread = new Thread( new ProgressThread() );



public MyProgressBar() {
add(MyBar);

int x = ( MyData.SCREEN.width / 2 ) - ( WIDTH / 2);
int y = ( MyData.SCREEN.height / 2 ) - ( HEIGHT / 2);

this.setBounds( x, y, WIDTH, HEIGHT );

MyFrame.setBounds( x, y, WIDTH, HEIGHT );
MyFrame.setUndecorated(true);
MyFrame.getContentPane().setSize( new Dimension( WIDTH, HEIGHT ) );
MyFrame.setMinimumSize( new Dimension( WIDTH, HEIGHT ) );
MyFrame.setPreferredSize( new Dimension( WIDTH, HEIGHT ) );
MyFrame.setSize( new Dimension( WIDTH, HEIGHT ) );
MyFrame.setVisible(false);
MyFrame.getContentPane().setLayout(null);

MyBar.setStringPainted( true );
MyBar.setBorderPainted( true );
MyBar.setValue( 0 );
MyBar.setBounds( 0, 0, WIDTH, HEIGHT );

MyFrame.add( MyBar );
MyFrame.pack();
MyFrame.repaint();

}

public void MyUpdateBar() {
MyBar.setValue( MyValue );
MyBar.repaint();
MyFrame.repaint();
this.repaint();
//dbug.Message( "MYPROGRESSBAR", "MyUpdateBar", "Value is %3.2f %d", MyBar.getPercentComplete(), MyValue );
}

public void MySetValue( int percent ) {
MyValue = (int)( MAX * ( (double)percent / 100.0 ) );
MyUpdateBar();
//dbug.Message( "MYPROGRESSBAR", "MySetValue", "Value is %3.2f %d percent was %d", MyBar.getPercentComplete(), MyValue, percent );
}

public void CreateAndShow () {
MyFrame.setVisible(true);
MyThread.start();
}

public void HideAndClear () {
MyThread.stop();
//frame.setVisible(false);
}

class ProgressThread implements Runnable {
public void run() {
EventQueue.invokeLater(new Runnable() {
public void run() {
while( MyValue < MyBar.getMaximum() ) {
MyBar.setValue( MyValue );
MyBar.repaint();
MyFrame.repaint();
dbug.Message( "MYPROGRESSBAR", "THREAD", "Value is %3.2f %d", MyBar.getPercentComplete(), MyValue );
}
}
});
}

}



}

如您所见,我创建了一个类来显示进度。发生的是我实例化类。加载我的 XML 文件,然后在解析数据时,我调用更新 MyValue,当我让我的调试消息出现时,我会看到它。但是,直到 100% 完成时,条形图本身才会显示。我已经阅读了有关线程并遵循其他人的示例的信息,如果我将其保留为他的示例,它就会起作用。如果我做了一些调整(更改线程中的循环以填充进度条的设置值以读取值)它甚至不会显示直到它是 100。

我做错了什么?

谢谢!

最佳答案

您的线程执行 SwingUtilities.invokeLater。您实际上是在 Swing 的 Event Dispatch Thread 上运行。不确定你想要达到什么目的。但看起来你正在阻止 EDT 并且你的 while 循环没有更新,因为 MySetValue 没有被执行。

考虑使用 SwingWorker 进行冗长的操作。 How to Use Progress Bars演示如何使用 SwingWorkerJProgressBar

确保从 Event Dispatch Thread 调用 setValue 方法。为此,您可以使用 SwingUtilities.invokeLater。阅读更多关于 Threads and Swing 的信息.

考虑这个简化的示例:

public static void main(String[] arguments) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

final JProgressBar bar = new JProgressBar(0, 100);

Thread t = new Thread(){
public void run(){
for(int i = 0 ; i < 100 ; i++){
final int percent = i;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
bar.setValue(percent);
}
});

try {
Thread.sleep(100);
} catch (InterruptedException e) {}
}
}
};
frame.add(bar);
frame.pack();
frame.setVisible(true);
t.start();
}

关于java - 我的 JProgressBar 在达到 100% 之前不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10437590/

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