Java swing不透明JProgressBar内部JProgressBar

Java swing不透明JProgressBar内部JProgressBar,java,swing,jprogressbar,Java,Swing,Jprogressbar,我正在尝试将两个JProgressBars组合在一起,以便能够表示关于单个事物的统计信息 我的问题是,如何将两个进度条合并或重叠,以使其工作 我提出的一个解决方案是将两个进度条放在一个JPanel中: 但这不是一个理想的解决方案 相反,我想做的是使顶部进度条不透明,然后重叠它。我相信使用组件可以在第一个JProgressBar的基础上添加第二个JProgressBar。但当我添加它时,我只能看到顶部的栏。即使我将它设置为不透明,它仍然不会同时显示这两个 bar1.setOpaque(false)

我正在尝试将两个JProgressBars组合在一起,以便能够表示关于单个事物的统计信息

我的问题是,如何将两个进度条合并或重叠,以使其工作

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

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

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

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

看来这应该很容易,所以我一定错过了一些关键的代码行。

这取决于您想要实现什么,例如,一点GridBagLayout魔术

我知道,我在Mac电脑上运行,对它说得越少越好


您可以考虑从JProgressBar中删除边框,并在包含面板周围实现单个边框,或者,如果所有其他操作都失败,只需使用自定义绘制来创建自己的边框,这取决于您想要实现的功能,例如,一点GridBagLayout魔法

我知道,我在Mac电脑上运行,对它说得越少越好


您可以考虑从JProgressBar中删除边框,并在包含面板周围实现单个边框,或者,如果所有其他操作都失败,只需使用自定义绘制来创建自己的边框。您可以通过覆盖JProgressBar.paintComponentGraphics 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);
}

复制粘贴完整代码并运行

您可以通过覆盖JProgressBar.paintComponentGraphics 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);
}

从中复制粘贴完整的代码并运行

效果很好!我只需要添加pb2.setOpaquefalse;pb2.setbackground新颜色0,0,0,0;要使背景透明,有没有办法更改顶部栏的颜色?Swing不支持透明颜色,有不透明或透明,用户设置为不透明。如果改变颜色很简单就好了,但是你可能需要一个定制的Progressinice和simple@JFreeman哦,如果真是这样的话,生活会多么轻松,但这就是为什么我可能会被诱惑去做一些完美的作品!我只需要添加pb2.setOpaquefalse;pb2.setbackground新颜色0,0,0,0;要使背景透明,有没有办法更改顶部栏的颜色?Swing不支持透明颜色,有不透明或透明,用户设置为不透明。如果改变颜色很简单就好了,但是你可能需要一个定制的Progressinice和simple@JFreeman哦,如果真是这样的话,生活会变得多么轻松,但这就是为什么我可能会想做一些像谢谢你这样的事!我只是花了一些时间测试两个解决方案,我发现另一个解决方案最适合我的需要,因为它看起来更符合我的程序的主题。谢谢!我只是花了一些时间测试两个解决方案,我发现另一个解决方案最适合我需要的,因为它看起来更符合我的程序的主题。