仅在Java中JProgress Bar 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

我有一个Jbutton“Highlight”,单击它会调用Jprogress栏。进度条工作正常,直到100%

如何在进度条达到100%后才显示结果

以下是代码的一部分:

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你是想对鲁道夫·赫斯特讲话吗?我想我们彼此都同意。