【问题标题】:Nice looking progress bar in javajava中漂亮的进度条
【发布时间】:2013-09-11 11:19:25
【问题描述】:

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

我一直在查看 JProgressBar 教程,但没有一个提到样式栏。阅读 API,我发现了一个返回 ProgressBarUI 对象的 getUI 方法,但我没有看到很多方法可以自定义该对象。

我想要的是添加圆角,改变背景和前景色,宽度,长度,通常。

谢谢!

【问题讨论】:

    标签: java swing jprogressbar


    【解决方案1】:

    如果您不想替换用户选择的外观,您可以将 UI 委托替换为派生自 BasicProgressBarUI 的委托。

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

    【讨论】:

    • 感谢您提供非常详细的回答! +1 和正确答案:D。无论如何,最后我使用带有圆形边框的JPanel,将一个重叠在另一个之上,因为我的“进度条”是静态的,所以诀窍就可以了。无论如何感谢您的好提示,trashgod,将其写下来以供进一步参考
    • @Trashgod +1 for the sn-p 我在 Google 上查找如何自定义 JProgressBar 时发现了这个 :)。 sn-p 的一件事:在paintIndeterminate(..) 中,您将Graphics 对象g 转换为Graphics2D,但是您通过g.fillOval(..) 进行绘画,因此缺少g2d.fillOval(..) 调用,该调用将创建JProgressBar 矩形边框。
    • @DavidKroukamp:很好的收获;尽管“传统方法的性能相同……在默认属性设置下”,g2d.fill(shape) 更加通用。
    【解决方案2】:

    最简单的方法是 change the LookAndFeel 或者甚至创建您自己的类,该类从默认 L&F 之一扩展而来,并且只是更改进度条的 UI...

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 2012-04-04
    • 2011-05-05
    • 2020-12-05
    • 2014-11-09
    相关资源
    最近更新 更多