Java swing不透明JProgressBar内部JProgressBar
我正在尝试将两个JProgressBars组合在一起,以便能够表示关于单个事物的统计信息 我的问题是,如何将两个进度条合并或重叠,以使其工作 我提出的一个解决方案是将两个进度条放在一个JPanel中: 但这不是一个理想的解决方案 相反,我想做的是使顶部进度条不透明,然后重叠它。我相信使用组件可以在第一个JProgressBar的基础上添加第二个JProgressBar。但当我添加它时,我只能看到顶部的栏。即使我将它设置为不透明,它仍然不会同时显示这两个Java swing不透明JProgressBar内部JProgressBar,java,swing,jprogressbar,Java,Swing,Jprogressbar,我正在尝试将两个JProgressBars组合在一起,以便能够表示关于单个事物的统计信息 我的问题是,如何将两个进度条合并或重叠,以使其工作 我提出的一个解决方案是将两个进度条放在一个JPanel中: 但这不是一个理想的解决方案 相反,我想做的是使顶部进度条不透明,然后重叠它。我相信使用组件可以在第一个JProgressBar的基础上添加第二个JProgressBar。但当我添加它时,我只能看到顶部的栏。即使我将它设置为不透明,它仍然不会同时显示这两个 bar1.setOpaque(false)
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哦,如果真是这样的话,生活会变得多么轻松,但这就是为什么我可能会想做一些像谢谢你这样的事!我只是花了一些时间测试两个解决方案,我发现另一个解决方案最适合我的需要,因为它看起来更符合我的程序的主题。谢谢!我只是花了一些时间测试两个解决方案,我发现另一个解决方案最适合我需要的,因为它看起来更符合我的程序的主题。