java中漂亮的进度条
我想知道你们中是否有人知道如何用Java显示一个漂亮的进度条,主要是使用Swing,尽管我不介意使用第三方库 我一直在看JProgressBar教程,但没有一个是关于酒吧风格的。在阅读API时,我发现了一个返回ProgressBarUI对象的getUI方法,但我看不到很多定制该方法的方法 我想要的是添加圆角,改变背景和前景颜色,宽度,长度,和往常一样java中漂亮的进度条,java,swing,jprogressbar,Java,Swing,Jprogressbar,我想知道你们中是否有人知道如何用Java显示一个漂亮的进度条,主要是使用Swing,尽管我不介意使用第三方库 我一直在看JProgressBar教程,但没有一个是关于酒吧风格的。在阅读API时,我发现了一个返回ProgressBarUI对象的getUI方法,但我看不到很多定制该方法的方法 我想要的是添加圆角,改变背景和前景颜色,宽度,长度,和往常一样 谢谢 最简单的方法是,甚至可以创建您自己的类,扩展默认L&F之一,只需更改进度条的UI…如果您不想替换用户选择的外观,可以将UI委托替换为派生自的
谢谢 最简单的方法是,甚至可以创建您自己的类,扩展默认L&F之一,只需更改进度条的UI…如果您不想替换用户选择的外观,可以将UI委托替换为派生自的UI委托
关于如何专门为JProgressBar这样做有什么想法吗?@AlejandroVK很难告诉你必须尝试,我会优先考虑物质,但对EDT太敏感了,谢谢你提供了非常详细的答案+1和正确答案:D.无论如何,在最后我使用了带有圆形边框的JPanel,一个接一个地重叠,因为我的“进度条”是静态的,所以技巧做到了。不管怎样,谢谢你的好建议,垃圾神,我会写下来供进一步研究reference@Trashgod+1对于这个片段,我是在谷歌上查看如何定制
JProgressBar
时发现的。这段代码有一点:在paintIndeterminate(…)
中,您将Graphic
的对象g
转换为Graphics2D
但是您通过g.fillOval(…)
绘制,因此缺少了g2d.fillOval(…)
调用,该调用将创建JProgressBar
矩形边框。@DavidKroukamp:Good catch;虽然“传统方法在默认属性设置下执行相同的操作,”g2d.fill(shape)
的功能更加广泛。
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.plaf.basic.BasicProgressBarUI;
/** @see http://stackoverflow.com/questions/8884297 */
public class ProgressBarUITest extends JPanel {
public ProgressBarUITest() {
JProgressBar jpb = new JProgressBar();
jpb.setUI(new MyProgressUI());
jpb.setForeground(Color.blue);
jpb.setIndeterminate(true);
this.add(jpb);
}
private static class MyProgressUI extends BasicProgressBarUI {
private Rectangle r = new Rectangle();
@Override
protected void paintIndeterminate(Graphics g, JComponent c) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
r = getBox(r);
g.setColor(progressBar.getForeground());
g.fillOval(r.x, r.y, r.width, r.height);
}
}
private void display() {
JFrame f = new JFrame("ProgressBarUITest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ProgressBarUITest().display();
}
});
}
}