【问题标题】:Java swing opaque JProgressBar inside JProgressBarJProgressBar 内的 Java swing 不透明 JProgressBar
【发布时间】:2019-04-02 08:03:47
【问题描述】:

我正在尝试将 2 个 JProgressBar 组合在一起,以便我可以表示有关单个事物的统计信息。

我的问题是如何将两个进度条组合或叠加起来,这样才能起作用?

我想出的一个解决方案是将 2 个进度条放在一个 JPanel 中:

但这不是一个理想的解决方案。

相反,我想做的是使顶部进度条不透明,然后将其重叠。我相信使用组件可以.add() 第二个 JProgressBar 到第一个。但是当我添加它时,我只能看到顶部栏。即使我将其设置为opaque,它仍然不会同时显示它们。

bar1.setOpaque(false);
bar1.setBorder(null);
bar2.add(bar1);

看起来应该很简单,所以我肯定遗漏了一些关键的代码行。

【问题讨论】:

    标签: java swing jprogressbar


    【解决方案1】:

    这“取决于”你想要达到的目标,例如,一点点GridBagLayout 魔法......

    (我知道,我在 Mac 上运行,关于它的说法越少越好;))

    public class TestPane extends JPanel {
    
        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weighty = 1;
            gbc.gridx = 0;
            gbc.gridy = 0;
    
            JProgressBar pb1 = new JProgressBar();
            pb1.setValue(50);
            JProgressBar pb2 = new JProgressBar();
            pb2.setValue(25);
    
            add(pb1, gbc);
    
            gbc.insets = new Insets(4, 4, 0, 0);
            add(pb2, gbc, 0);
        }
    }
    

    您可以考虑从 JProgressBar 中删除边框并在包含面板周围实现单个边框,或者,如果所有其他方法都失败,只需使用自定义绘画制作自己的边框

    【讨论】:

    • 完美运行!我只需要添加pb2.setOpaque(false);pb2.setBackground(new Color(0,0,0,0)); 以使背景透明
    • 有没有办法改变顶栏的颜色?
    • Swing 不支持透明色,有 opaque 和 transparent 之分,用户 setOpaque 代替。如果可以简单地更改颜色会很好,但是你可能需要一个自定义 ProgressUi
    • 又好又简单
    • @JFreeman 哦,如果是这样,生活会多么轻松,但这就是为什么我可能会想做类似this的事情
    【解决方案2】:

    您可以通过覆盖JProgressBar.paintComponent(Graphics g) 来模拟第二个进度条。
    在以下过度简化的示例中,它绘制了一条线,其长度表示第二个“条”的值:

    class BasicDoubleProgressbar extends JProgressBar{
    
        private int secondaryBarValue;
    
        void setSecondValue(int value){
            secondaryBarValue = value;
        }
    
        @Override
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.CYAN);
            g2.setStroke( new BasicStroke(5));
            g2.drawLine(0, 10, secondaryBarValue,10);
        }
    }
    

    测试一下:

    public static void main(String[] args) {
        BasicDoubleProgressbar pBar = new BasicDoubleProgressbar();
        pBar.setMinimum(0); pBar.setMaximum(100);
        pBar.setValue(0);
        pBar.setForeground(Color.blue);
    
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(pBar);
        f.pack();
    
        Timer timer = new Timer(100, new ActionListener() {
            int counter = 1;
            @Override
            public void actionPerformed(ActionEvent ae) {
                pBar.setValue(++counter);
                pBar.setSecondValue(counter/2);
                if (counter > 100) {
                    counter = 0;
                }
            }
        });
    
        timer.start();
        f.setVisible(true);
    }
    

    (从here复制粘贴完整代码并运行)

    【讨论】:

    • 谢谢!我只是花了一些时间测试这两个解决方案,我发现另一个解决方案 (MadProgrammer) 最适合我的需要,因为它看起来更适合我的程序主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多