Java在JProgressBar中摆动不透明的JProgressBar

问题描述 投票:1回答:2

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

我的问题是如何将两个进度条组合或叠加,以便这可以工作?

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

enter image description here

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

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

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

它似乎应该很容易,所以我必须缺少一些关键的代码行。

java swing jprogressbar
2个回答
2
投票

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

(我知道,我在Mac上运行,对此越少越好;))

Overlapping

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中删除边框并在包含的面板周围实现单个边框,或者,如果所有其他方法都失败,只需使用自定义绘画制作您自己的边框


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

enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.