簡體   English   中英

JProgressBar內的Java Swing不透明JProgressBar

[英]Java swing opaque JProgressBar inside JProgressBar

我正在嘗試將2個JProgressBars組合在一起,以便可以表示有關單個事件的統計信息。

我的問題是,如何將兩個進度條進行組合或疊加以使其可行?

我想出的一種解決方案是將兩個進度條放到一個JPanel中:

在此處輸入圖片說明

但這不是理想的解決方案。

相反,我想做的是使頂部進度欄不透明,然后將其重疊。 我相信使用組件可以將第二個JProgressBar .add()到第一個。 但是,當我添加它時,我只能看到頂部的欄。 即使我將其設置為opaque它仍然不會同時顯示它們兩者。

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

看來這應該很容易,所以我必須缺少一些關鍵的代碼行。

它“取決於”您要實現的目標,例如,一些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刪除邊框並在包含面板周圍實現單個邊框,或者,如果其他所有方法都失敗,則可以使用自定義繪畫簡單地制作自己的邊框

您可以通過重寫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);
}

在此處輸入圖片說明

(從此處復制粘貼完整的代碼並運行)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM