2017-05-04 71 views
2

我看How To Use BoxLayout文件,其中明確表示,如何使用BoxLayout將組件拉伸到整行上?

如果沒有什麼組件的最大寬度?在這種情況下,如果所有組件都具有相同的X對齊,則所有組件均爲 ,其寬度與其容器一樣寬。

我們假設我們將大量JButton實例添加到JPanel。如果這些按鈕的最大寬度是並且我們在所有這些按鈕上調用setAlignmentX(Component.LEFT_ALIGNMENT) - 然後這些按鈕中的每一個都應該在整個行上延伸。該文檔甚至使用下面的圖片說明了這一點。

enter image description here

我不能得到這個工作!

我試過在按鈕上試過setMaximumSize(null)和setMaximumSize(new Dimension(-1,-1))setMaximumSize(new Dimension(0,0)),但沒有給我描述的行爲。

如果沒有什麼組件的最大寬度:

什麼excactly當它說沒有文件的意思

什麼是無最大寬度?


我已經能夠生產的最好的是下面。閱讀文檔我會期望按鈕應該能夠在整個行上展開。我知道我也可以使用其他佈局管理器,但我希望通過BoxLayout來實現這一點(授予文檔是正確的/我已經理解了文檔的權利)。

enter image description here

public class CustomList extends JPanel { 

    private final Box box = Box.createVerticalBox(); 

    public CustomList() { 
     for (int i = 0; i < 10; i++) { 
      JButton b = new JButton("Button item" + i); 
      //b.setMaximumSize(new Dimension(0,0)); 
      b.setAlignmentX(Component.LEFT_ALIGNMENT); 
      box.add(b); 
     } 
     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     add(box, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     CustomList l = new CustomList(); 
     l.setSize(200, 200); 
     l.setBackground(Color.red); 

     JFrame frame = new JFrame("Vertical Box"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(l, BorderLayout.CENTER); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 
    } 

} 
+0

我看到,如果我用JPanel替換JButton - 不管是否設置了最大大小 - 那麼每個JPanel將跨越整個行。 – sbrattla

回答

2

你的按鈕確實有一個最大寬度。

你可以做的是在你的循環中創建JPanel對象BorderLayout,將每個按鈕添加到每個面板(至BorderLayout.CENTER,這是默認情況下)。

BorderLayout.CENTER不關心它的子Component的最大尺寸,所以你最終有JPanel,其全部內容通過JButton填補。

由於JPanel本身具有的new Dimension(Short.MAX_VALUE, Short.MAX_VALUE)巨大的默認最大大小(這是寬度= 32767,身高= 32767 !!),這是Component默認的最大尺寸,你會得到預期的結果:

public CustomList() { 
    for (int i = 0; i < 10; i++) { 

     JPanel panel = new JPanel(new BorderLayout()); 
     JButton b = new JButton("Button item" + i); 
     //b.setMaximumSize(new Dimension(0,0)); 
     b.setAlignmentX(Component.LEFT_ALIGNMENT); 
     panel.add(b); 
     box.add(panel); 
    } 
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
    add(box, BorderLayout.CENTER); 
} 
+1

謝謝,這與我在用JPanel替換JButton時看到的結果非常吻合 - 面板橫跨整行。謝謝! – sbrattla

+0

作爲附註:您提到按鈕的最大寬度。那很好。但是,一個組件的最大寬度是什麼也沒有。這些文檔意味着什麼? – sbrattla

+1

嗯,我想「無」是誤導,它應該意味着「不計算」,但即使「JPanel」實際上有一個默認的最大尺寸,但它是巨大的,可以被認爲沒有最大尺寸。從'Component'的源代碼中,默認的最大尺寸是'new Dimension(Short.MAX_VALUE,Short.MAX_VALUE)',它是width = 32767,height = 32767。 – Berger