java中漂亮的进度条

java中漂亮的进度条,java,swing,jprogressbar,Java,Swing,Jprogressbar,我想知道你们中是否有人知道如何用Java显示一个漂亮的进度条,主要是使用Swing,尽管我不介意使用第三方库 我一直在看JProgressBar教程,但没有一个是关于酒吧风格的。在阅读API时,我发现了一个返回ProgressBarUI对象的getUI方法,但我看不到很多定制该方法的方法 我想要的是添加圆角,改变背景和前景颜色,宽度,长度,和往常一样 谢谢 最简单的方法是,甚至可以创建您自己的类,扩展默认L&F之一,只需更改进度条的UI…如果您不想替换用户选择的外观,可以将UI委托替换为派生自的

我想知道你们中是否有人知道如何用Java显示一个漂亮的进度条,主要是使用Swing,尽管我不介意使用第三方库

我一直在看JProgressBar教程,但没有一个是关于酒吧风格的。在阅读API时,我发现了一个返回ProgressBarUI对象的getUI方法,但我看不到很多定制该方法的方法

我想要的是添加圆角,改变背景和前景颜色,宽度,长度,和往常一样


谢谢

最简单的方法是,甚至可以创建您自己的类,扩展默认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();
            }
        });
    }
}