我在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);
}
}
答案 0 :(得分:8)
Windows原生外观进度条的java代码以原始Windows进度条的方式呈现PROGRESSCHUNKSIZE
步骤。请参阅the source for the Windows JProgressBar。
它只是没有顺利渲染。如果您单步进度条,则可以看到这些块。
它可以自定义,但我不知道你将如何实现它。
问题的根源
最初的Windows XP进度条是小盒子。 theme defined一个大小的盒子,以及盒子之间的空隙。对于Vista及更高版本,主题已更改为指定框之间的间隙为0,但从未将框的大小重置为1像素。通过OpenThemeData
和GetThemeInt
Win32API
函数读取值会显示我的主题(Windows 8)的块大小为6
。
答案 1 :(得分:2)
在设置系统L& F时,它看起来像布局问题/错误。
我设法通过设置问题的进度条设置首选大小来隐藏错误:
progressSix.setPreferredSize(new Dimension(200, 15));
似乎与进度条大小有关。如果我使用BoxLayout
代替FlowLayout
并充分调整容器大小,我可以看到即使是较小的值也会显示。
答案 2 :(得分: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.*
键中,我只能找到蓝色。