JProgressBar:低值将不会显示。

7
我尝试在Java中使用JProgressBar函数,但是有一个问题我无法解决:
当我将最小值设置为零,最大值设置为100,当前值设置为6时,则不会显示任何内容。进度条为空。如果我将当前值设为7,则可以正常工作。这似乎是由于空边框或其他空间引起的问题。该问题仅在Windows 7上出现,并且仅在UIManager设置为SystemLookAndFeel时才会出现。
有人知道这个问题并有解决方法吗?下面是我的代码:
package lab;

import java.awt.FlowLayout;

import javax.swing.JDialog;
import javax.swing.JProgressBar;
import javax.swing.UIManager;

import core.Config;


public class ProgressSample extends JDialog {

public ProgressSample() {

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    getContentPane().setLayout(new FlowLayout());

              // Nothing is displayed
    JProgressBar progressSix = new JProgressBar(0, 100);
    progressSix.setValue(6);
    getContentPane().add(progressSix);

              // This works
    JProgressBar progressSeven = new JProgressBar(0, 100);
    progressSeven.setValue(7);
    getContentPane().add(progressSeven);

    pack();
}

public static void main(String[] args) {

    try {
        UIManager.setLookAndFeel(UIManager
        .getSystemLookAndFeelClassName());
    } catch (Exception e) {
        e.printStackTrace();
    }

    ProgressSample dialogTest = new ProgressSample();
    dialogTest.setVisible(true);
}

}

2
哦,有趣。它在大约66/1000秒时启动。这很奇怪。你有检查过Bug DB吗?请检查一下,如果找不到类似的问题,请发布一个新的报告以供评估。 - Andrew Thompson
我找不到任何关于这个问题的错误报告。如果我无法解决问题,我会发布一份报告。但是正如你所看到的,我的英语知识并不是很好... - Benchy
1
在JDK7_011中出现了问题。 - mKorbel
2
"我的英语知识不是很好。"你的英语足以让我准确理解你的意思。至少我这样认为。但其实也不重要,因为大多数时候,代码才是真正表达自己的方式,它会清晰而响亮地说话。 :)" - Andrew Thompson
@AndrewThompson 哦,太好了!+1 - joey rohan
3个回答

8

这个 Windows 本地外观进度条的 Java 代码使用 PROGRESSCHUNKSIZE 步骤来呈现原始的 Windows 进度条。请参见 Windows JProgressBar 的源代码

只是它没有平滑地呈现。如果你逐步移动进度条,你可以看到块。

可能是可定制的,但我不知道如何实现。

问题的起源

原始的Windows XP进度条是由小方块组成的。主题定义了方块的大小和间隙。对于Vista及以后版本,主题被更改为将方块之间的间隙指定为0,但从未将方块大小重置为1像素。通过OpenThemeDataGetThemeInt Win32API函数读取该值可发现我的主题(Windows 8)的块大小为6


直到看到你关于“string painted”的评论并尝试了一下,我才相信这个答案。这确实是一个棘手的 bug。 - Andrew Thompson
我可以扩展BasicProgressBarUI并覆盖getCellLength()和getCellSpacing()。但是当我尝试从WindowsProgressBarUI扩展时,会出现错误:“访问限制:由于所需库的限制,无法访问WindowsProgressBarUI类型”。 - Benchy
1
你的错误是Eclipse中的“为了你自己的安全”机制。我尝试从实现中复制粘贴该方法,但许多类/类型是非公共的,因此无法使用。 - Anya Shenanigans

2

看起来在设置系统L&F时存在布局问题/错误。

我通过为具有问题的进度条设置首选大小来隐藏错误:

progressSix.setPreferredSize(new Dimension(200, 15));

看起来与进度条大小有关。如果我使用BoxLayout而不是FlowLayout并且将容器的大小调整足够,即使是较小的值,我也可以看到它显示。


有意思。只要比首选大小多一个像素就能够解决问题。 - Andrew Thompson
2
我尝试了这个,但唯一的改进是它显示当前值大于4(而不是6)。如果我输入1到4之间的值,我仍然有同样的问题。 - Benchy
有人还记得 XP 默认的进度条,里面有一些小矩形吗?这就是这个问题的症状。它将进度条分成了几个块。Joey Rohan 的回答实际上通过使用 setStringPainted(true) 将外观恢复为金属风格,因此不再是 Windows 风格的进度条。 - Anya Shenanigans

0

在设置以下内容后,进度指示器变得平滑:

progressBar.setStringPainted(true);

现在它显示了一个百分比,并且颜色变成了蓝色。你可以这样做:

progressBar.setString(""); // null means automatic percentage
progressBar.setForeground(new Color(0, 210, 40)); // Windows7-green

我认为这个方法可行是因为进度条现在是由SWING部分绘制而不是由操作系统绘制。 进度指示器看起来不同,因为它缺少类似玻璃的高光,并且被涂成实心。 背景仍然看起来一样。 我猜测SWING让操作系统将其绘制为进度为0%,然后绘制一个填充的矩形和文本。

最后一个设置,颜色,可能可以通过查询UI常量来改进。 但是,在WindowsLookAndFeel的所有ProgressBar.*键中,我只能找到蓝色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接