gpt4 book ai didi

java - 我如何制作一个可以从调用类更新值的 Progress Bar 类

转载 作者:行者123 更新时间:2023-11-29 08:07:03 26 4
gpt4 key购买 nike

我已经尝试按照教程进行操作,但我总是迷路。

我需要的是一个创建和显示进度条 (JProgressBar) 的类,当我迭代从文件加载的数据并将其放入数据库内存时,我可以设置进度条的值。我的问题是我发现的每个示例都有某种计数器,它填充进度条并从“主”函数执行。每次我将该教程更改为我可以随意调用并显示栏的类时,我都没有显示栏(IE 框架出现但栏甚至看起来不像添加到框架中,直到之后迭代完成)。

我尝试过使用 SwingUtilities.invokeLaterSwingWorker(下面类(class)的最新尝试)都遇到了同样的问题。更糟的是,我可以执行 dbug.myMessage(基本上发送到 System.out)并看到一条消息,显示内存中的栏正在更改,只是没有显示.我显然遗漏了一些可能很简单的东西,但我想不出它是什么。

另一件事,如果我按原样离开教程 Java Tutorials Code Sample – ProgressBarDemo2.java只需将 main 方法更改为 createAndShow 方法,它就可以工作,但当然它不会执行我需要它执行的操作。

我确实发布了另一个关于此的问题,但对类(class)进行了如此大的改动,我认为最好发布一个新问题。

所以,这是我修改后的代码,但似乎不起作用:

public class MyProgressBar extends JPanel implements PropertyChangeListener, 
MyData,
Serializable {

/**
*
*/
private static final long serialVersionUID = -1632492668549544408L;

private MyDebug dbug = new MyDebug( MyData.MYDEBUGCHECK.MYPROGRESSBAR.getOn() );

public static final int MAX = 100;
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();

public Task task;


class Task extends SwingWorker<Void, Void> {

public int myValue = 0;

@Override
public Void doInBackground() {
//Initialize progress property.
setProgress(0);
while (myValue < 100) {
//Make random progress.
//myValue += random.nextInt(10);
setProgress( Math.min( myValue, 100 ) );
dbug.myMessage( "MYPROGRESSBAR", "doInBackground", "Value is %3.2f %d", myBar.getPercentComplete(), myValue );
myBar.repaint();
}
return null;
}

public void done() {
}

public void mySetValue( int percent ) {
myValue = (int)( MAX * ( (double)percent / 100.0 ) );
dbug.myMessage( "MYPROGRESSBAR", "mySetValue", "Value is %3.2f %d percent was %d", myBar.getPercentComplete(), myValue, percent );
}

}



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);
myFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

myBar.setStringPainted( true );
myBar.setBorderPainted( true );
myBar.setValue( 0 );
myBar.setBounds( 0, 0, WIDTH, HEIGHT );
myBar.addPropertyChangeListener( this );

myFrame.add( myBar );

//Create and set up the content pane.
//JComponent newContentPane = new MyProgressBar();
JComponent newContentPane = myBar;
newContentPane.setOpaque(true); //content panes must be opaque

myFrame.setContentPane(newContentPane);
myFrame.pack();

}

public void createAndShow () {

//Display the window.
myFrame.setVisible(true);
myFrame.repaint();

}

public void hideAndClear () {
//myFrame.setVisible(false);
}


@Override
public void propertyChange(PropertyChangeEvent args) {
dbug.myMessage( "MYPROGRESSBAR", "propertyChange", "Value is %s", args.getPropertyName() );
if ( "progress" == args.getPropertyName() ) {
int progress = (Integer) args.getNewValue();
//myBar.setValue(progress);
}
}

public void start () {
//Instances of javax.swing.SwingWorker are not reusuable, so
//we create new instances as needed.
task = new Task();
task.addPropertyChangeListener(this);
task.execute();
}

}

最佳答案

您应该调用 SwingWorker 中可用的 publish 方法,而不是在 doInBackGround 方法中调用 setProgress .

publish 方法会将这些值传递给在事件调度线程上调用的 process 方法,您应该在该方法中更新进度条。

another question我已经发布了一个完全可以做到这一点的示例

关于java - 我如何制作一个可以从调用类更新值的 Progress Bar 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10450571/

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