仅在Java中JProgress Bar 100%完成后显示结果
我有一个Jbutton“Highlight”,单击它会调用Jprogress栏。进度条工作正常,直到100% 如何在进度条达到100%后才显示结果 以下是代码的一部分:仅在Java中JProgress Bar 100%完成后显示结果,java,swing,jprogressbar,Java,Swing,Jprogressbar,我有一个Jbutton“Highlight”,单击它会调用Jprogress栏。进度条工作正常,直到100% 如何在进度条达到100%后才显示结果 以下是代码的一部分: final JProgressBar progressBar = new JProgressBar(); progressBar.setMaximum(100); progressBar.setStringPainted(true); btnNewButton_2.addActionListener(new ActionLi
final JProgressBar progressBar = new JProgressBar();
progressBar.setMaximum(100);
progressBar.setStringPainted(true);
btnNewButton_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread t = new Thread(new Runnable() {
public void run() {
int i = 1;
progressBar.setMinimum(0);
progressBar.setMaximum(100);
try {
while (i <= 100 || true) {
progressBar.setValue(i);
i++;
Thread.sleep(38);
}
} catch (InterruptedException ex){}
}});
t.start();
final JProgressBar progressBar=新的JProgressBar();
进度条设置最大值(100);
progressBar.SetStringPaint(真);
btnNewButton_2.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
线程t=新线程(新的可运行线程(){
公开募捐{
int i=1;
progressBar.setMinimum(0);
进度条设置最大值(100);
试一试{
while(ii++之后添加if语句:)
不要忘记使用。当前的代码很可能无法正常运行,因为您正在从错误的线程操作GUI控件。在i++之后添加if语句:)
try{
while (i <= 100 || true) {
progressBar.setValue(i);
i++;
Thread.sleep(38);
}
// progress is definitely at 100 now
// do whatever you need to display result here -- it would be faster than doing the check
// if(i==100) in every execution inside the while loop.
System.out.println("Progress is done!!!");
} catch (....
不要忘记使用。当前的代码很可能无法正常运行,因为您正在从错误的线程操作GUI控件。try{
try{
while (i <= 100 || true) {
progressBar.setValue(i);
i++;
Thread.sleep(38);
}
// progress is definitely at 100 now
// do whatever you need to display result here -- it would be faster than doing the check
// if(i==100) in every execution inside the while loop.
System.out.println("Progress is done!!!");
} catch (....
而(我试试看){
虽然(我不明白为什么这里需要invokeAndWait…关键是您不希望GUI等待(挂起)后台线程工作时。我们不需要担心AWT事件队列中发生了什么。记住在AWT线程上触发GUI事件很重要,但是您可以从任何线程调用GUI组件的getter和setter。@RudolphEst GUI组件不应该有任何修改来自不同线程(示例中就是这样发生的)@sdasdas据我所知,除了AWTEventQueue
之外,您不应该影响任何线程中的GUI事件。在这种情况下,设置该值将触发AWTEventQueue
上的实际更改事件,而不是当前线程中的事件,因此当从AWT处理该事件时,GUI的实际修改和更新将发生事件队列。如果您确实觉得有必要,可以使用invokeAndWait()将progressBar.setValue()
包装在invokeLater()中
在这里不正确,因为后台进程可以在不等待GUI更新的情况下继续。@sdadas中没有写入JProgressBar.setValue是多线程安全的,但是它被写入时整个类都不是。另外,从中看,调用似乎不是排队的,或者有些。Swing通常不是多线程安全的虽然这对某些程序、操作系统和jre来说可能只是偶然的kauskas@AudriusMeškauskas你的意思是说RudolphEst吗?我想我们彼此都同意。我不明白为什么这里需要invokeAndWait…关键是你不想让你的GUI等待(挂起)后台线程工作时。我们不需要担心AWT事件队列中发生了什么。记住在AWT线程上触发GUI事件很重要,但是您可以从任何线程调用GUI组件的getter和setter。@RudolphEst GUI组件不应该有任何修改来自不同线程(示例中就是这样发生的)@sdasdas据我所知,除了AWTEventQueue
之外,您不应该影响任何线程中的GUI事件。在这种情况下,设置该值将触发AWTEventQueue
上的实际更改事件,而不是当前线程中的事件,因此当从AWT处理该事件时,GUI的实际修改和更新将发生事件队列。如果您确实觉得有必要,可以使用invokeAndWait()将progressBar.setValue()
包装在invokeLater()中
在这里不正确,因为后台进程可以在不等待GUI更新的情况下继续。@sdadas中没有写入JProgressBar.setValue是多线程安全的,但是它被写入时整个类都不是。另外,从中看,调用似乎不是排队的,或者有些。Swing通常不是多线程安全的虽然这对某些程序、操作系统和jre来说可能只是偶然的kauskas@AudriusMeškauskas你是想对鲁道夫·赫斯特讲话吗?我想我们彼此都同意。