首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java swing不透明JProgressBar在JProgressBar中

Java swing不透明JProgressBar在JProgressBar中
EN

Stack Overflow用户
提问于 2019-04-02 08:03:47
回答 2查看 170关注 0票数 1

我试图将两个JProgressBars组合在一起,这样我就可以表示关于单个事物的统计数据。

我的问题是,如何将这两个进度条合并或叠加成这样才能工作?

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

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

相反,我想做的是让最上面的进度条不透明,然后重叠。我相信,有了组件,就可以将第二个.add()转换为第一个JProgressBar。但是当我加进去的时候,我只能看到上面的条子。即使我把它设置为opaque,它仍然不能同时显示它们。

代码语言:javascript
复制
bar1.setOpaque(false);
bar1.setBorder(null);
bar2.add(bar1);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-02 09:26:26

它“取决于”你想要实现什么,例如,一点点的GridBagLayout魔法.

(我知道,我在用Mac,说得越少越好;)

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-04-02 16:57:24

您可以通过重写JProgressBar.paintComponent(Graphics g)来模拟第二个进度条。

在以下过于简化的示例中,它绘制了一条线,其长度表示第二个“bar”的值:

代码语言:javascript
复制
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);
    }
}

测试它:

代码语言:javascript
复制
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);
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55469730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档