【问题标题】:Display Result only after JProgress Bar Completes 100% in Java仅在 JProgress Bar 在 Java 中完成 100% 后显示结果
【发布时间】:2013-02-28 16:24:43
【问题描述】:

我有一个 Jbutton“突出显示”,单击它会调用 Jprogress Bar。进度条可以正常工作,直到 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();

//System.out.println("Jprogress Bar Reached 100%)??

【问题讨论】:

    标签: java swing jprogressbar


    【解决方案1】:

    在 i++ 之后添加 if 语句 :)

      i++;
      if (i == 100) {
        displayResult();
        return;
      }
    

    不要忘记使用invokeAndWait。当前代码很可能无法正常运行,因为您从错误的线程操作 GUI 控件。

    【讨论】:

    • 我不明白为什么这里需要 invokeAndWait... 重点是您不希望您的 GUI 在后台线程工作时等待(挂起)。我们不需要担心这里的 AWT 事件队列中发生了什么。记住在 AWT 线程上触发 GUI 事件很重要,但是您可以从任何线程调用 GUI 组件的 getter 和 setter。
    • @RudolphEst 不应从不同的线程对 GUI 组件进行任何修改(这就是示例中发生的情况)。
    • @sdasdadas 据我了解,除了AWTEventQueue 之外,您不应影响任何线程中的 GUI 事件。在这种情况下,设置该值将触发AWTEventQueue 上的实际更改事件,而不是在当前线程中,因此当从 AWTEventQueue 处理该事件时,将发生 GUI 的实际修改和更新。如果您确实觉得有必要,您可以将progressBar.setValue() 包装在invokeLater() 中,但这里使用invokeAndWait() 是不正确的,因为后台进程可以继续进行而无需等待GUI 更新。
    • @sdasdadas 在documentation 中没有写到 JProgressBar.setValue 是多线程安全的,但它写的是整个类不是。同样来自source code 的呼叫看起来不像在排队或在某种程度上。 Swing 通常不是多线程安全的,而这对于某些程序、操作系统和 jre 可能只是偶然的。 ——奥德瑞斯·梅斯考斯卡斯
    • @AudriusMeškauskas 你是想和 RudolphEst 联系吗?我认为我们彼此同意。
    【解决方案2】:
    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 (....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2023-03-10
      • 2021-10-14
      • 2016-07-10
      • 2020-07-18
      • 2021-08-25
      • 2019-09-14
      相关资源
      最近更新 更多