我试图将两个JProgressBars组合在一起,这样我就可以表示关于单个事物的统计数据。
我的问题是,如何将这两个进度条合并或叠加成这样才能工作?
我想出的一个解决方案是将两个进度条放在一个JPanel中:

但这不是一个理想的解决方案。
相反,我想做的是让最上面的进度条不透明,然后重叠。我相信,有了组件,就可以将第二个.add()转换为第一个JProgressBar。但是当我加进去的时候,我只能看到上面的条子。即使我把它设置为opaque,它仍然不能同时显示它们。
bar1.setOpaque(false);
bar1.setBorder(null);
bar2.add(bar1);这看起来应该很容易,所以我必须错过一些关键的代码行。
发布于 2019-04-02 09:26:26
它“取决于”你想要实现什么,例如,一点点的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中移除边框,并在包含面板周围实现单个边框,或者,如果其他所有操作失败,只需使用自定义画图就可以了。
发布于 2019-04-02 16:57:24
您可以通过重写JProgressBar.paintComponent(Graphics g)来模拟第二个进度条。
在以下过于简化的示例中,它绘制了一条线,其长度表示第二个“bar”的值:
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);
}

(从这里复制粘贴完整代码并运行)
https://stackoverflow.com/questions/55469730
复制相似问题