Java JProgressBar:将不显示低值

Java JProgressBar:将不显示低值,java,swing,look-and-feel,jprogressbar,Java,Swing,Look And Feel,Jprogressbar,我在Java中试用了JProgressBar的功能。但有一个问题我无法解决: 当我将最小值设置为零,最大值设置为100,当前值设置为6时,将不显示任何内容。进度条为空。如果我把7作为当前值,它就会工作。任何空白边界或其他空间似乎都有问题。只有当UIManager设置为SystemLookAndFeel时,Windows 7才会出现此问题 有人知道这个问题并有解决办法吗?下面是我的代码: package lab; import java.awt.FlowLayout; import javax

我在Java中试用了JProgressBar的功能。但有一个问题我无法解决:

当我将最小值设置为零,最大值设置为100,当前值设置为6时,将不显示任何内容。进度条为空。如果我把7作为当前值,它就会工作。任何空白边界或其他空间似乎都有问题。只有当UIManager设置为SystemLookAndFeel时,Windows 7才会出现此问题

有人知道这个问题并有解决办法吗?下面是我的代码:

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);
}

}

设置系统L&F时,看起来像是布局问题/错误

我通过设置进度条的首选大小来隐藏错误:

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

这似乎与进度条的大小有关。如果我使用
BoxLayout
而不是
FlowLayout
并充分调整容器的大小,我甚至可以看到它显示较小的值。

用于Windows本机外观进度条的java代码以原始Windows进度条的方式使用
PROGRESSCHUNKSIZE
步骤进行渲染。请看

它只是不能平滑地渲染。如果你步进进度条,你可以看到块

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

问题来源


原来的WindowsXP进度条在小盒子里。盒子的尺寸和盒子之间的间隙。对于Vista和更高版本,主题已更改为将长方体之间的间距指定为0,但从未将长方体大小重置为1像素。通过
OpenThemeData
GetThemeInt
Win32API
函数读取值,会发现我的主题(Windows 8)的块大小为
6

设置以下参数后,进度指示器会变得平滑:

progressBar.setStringPainted(true);
但是现在它显示了一个百分比,颜色变为蓝色。您可以这样做:

progressBar.setString(""); // null means automatic percentage
progressBar.setForeground(new Color(0, 210, 40)); // Windows7-green
我认为这是可行的,因为现在这个条线(部分)是通过SWING而不是操作系统绘制的。由于进度指示器缺少玻璃状高光,并且被漆成实心,因此该条看起来不同。背景看起来还是一样。我的猜测是,SWING让操作系统将其绘制为进度为0%,然后绘制一个填充矩形,并在顶部绘制文本


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

。有趣。它以大约66/1000的速度开始。这很奇怪。你检查过房间了吗?检查它,如果你找不到任何类似的东西,发布一个新的报告进行评估。我找不到任何报告的错误。如果我不能解决这个问题,我将发布一份报告。但正如你所看到的,我的英语知识不是很好……在JDK7_011中,我也介绍了“我的英语知识不是很好”,你的英语运用很好,我完全明白你的意思。至少我想我知道。不管怎么说,这并不重要,因为“说话”的主要是代码,而且它说话响亮而清晰@安德烈霍姆普森啊,伟大的话语+1有趣。比首选大小宽1像素可以解决这个问题。我尝试过这个方法,但唯一的改进是,它显示的当前值大于4(而不是6)。如果我把值放在1和4之间,我也有同样的问题。有人记得XP默认进度条有小矩形吗?这是一种症状。它以块的形式显示进度条。Joey Rohan的回答实际上将外观还原为金属,因为使用了
setStringPainted(true)
,这使得它不是windows风格的进度,直到我看到你关于“string painted”的评论并尝试了它,barI才相信这个回答!这确实是一个棘手的错误。我可以扩展BasicProgressBarUI并覆盖getCellLength()和getCellSpacing()。但是,当我尝试从WindowsProgressBarUI扩展时,出现了一个错误:“访问限制:由于所需库的限制,无法访问WindowsProgressBarUI类型”您的错误是eclipse中的“为了您自己的安全”机制。我尝试从实现中复制粘贴该方法,但有许多类/类型是非公共的,所以无法使用。