【问题标题】:JProgressBar not animating ONLY on Mac with Java 1.7JProgressBar 仅在使用 Java 1.7 的 Mac 上不动画
【发布时间】:2013-01-30 03:59:29
【问题描述】:

下面是一些在 EDT 上创建和显示 JProgressBar 的代码。在 Apple 的 Java 6 上,进度条是动画的。在 Oracle 的 Java 7 上,它不会:

import javax.swing.*;

public class ScratchSpace {

    public static void main(String[] args) {

        System.out.println("java.version = " + System.getProperty("java.version"));
        System.out.println("java.vm.version = " + System.getProperty("java.vm.version"));

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JProgressBar progressBar = new JProgressBar();
                progressBar.setIndeterminate(true);

                JFrame frame = new JFrame();
                frame.getContentPane().add(progressBar);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });

    }
}

确切地说,我使用的是 Java 1.7.0_12-ea 和 OS X 10.8.3。

你能看出我做错了什么吗?如果没有,是否有解决方法?

编辑:这是文本输出:

java.version = 1.7.0_12-ea
java.vm.version = 24.0-b27

编辑:it seems to be a known problem

所以现在我的问题是:我该如何解决这个问题?

【问题讨论】:

  • “你能看出我做错了什么吗?” 我觉得很好。事实上,这个简短的示例和结果表明 JRE 中存在错误。检查bug DB 是否有任何类似和可能的解决方法。如果没有发现,请提出新的报告。
  • 您能在输出中添加java.version+**java.vm.version** 吗?我不确定是否有必要,但它不会伤害。

标签: java macos swing event-dispatch-thread jprogressbar


【解决方案1】:

由于这是一个已确认的 JRE 错误,因此变通方法将是相当骇人听闻的。

如果您只是在不确定模式下使用进度条(换句话说,您不需要显示实际进度,只是有一个长时间运行的任务),请尝试使用SwingX 的 JXBusyLabel 代替。 (注意:祝你找到文档好运……现在所有的链接似乎都坏了)

如果这不是一个选项,您可以尝试使用计时器定期强制重绘的旧 VB6 方法。天真的实现:

import javax.swing.*;

public class ScratchSpace {

    public static void main(String[] args) {

        System.out.println("java.version = " + System.getProperty("java.version"));
        System.out.println("java.vm.version = " + System.getProperty("java.vm.version"));

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JProgressBar progressBar = new JProgressBar();
                progressBar.setIndeterminate(true);

                int delayMilliseconds = 250;
                Timer repaintTimer = new javax.swing.Timer(delayMilliseconds, new ActionListener(){
                    @Override
                    public void actionPerformed(final ActionEvent ae) {
                        progressBar.repaint();
                    }
                });
                repaintTimer.start();

                JFrame frame = new JFrame();
                frame.getContentPane().add(progressBar);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });        
    }
}

【讨论】:

  • 强制调用 repaint 并没有解决问题 - 但这是个好主意。目前使用 JXBusyLabel 可能是一个足够好的解决方案。而且,正如命运所愿,我的项目中已经有了 swingx,以及它的所有源代码和文档,包括 JXBusyLabel。
猜你喜欢
  • 1970-01-01
  • 2020-07-01
  • 2014-11-21
  • 2017-03-07
  • 2012-03-19
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多