2011-11-04 17 views
2

最近,我已經開始在Java中進行UI開發;我曾經在WPF中進行UI開發。關於Java做事方式的一些事情令人困惑。使用BoxLayout在JPanel內設置JButton的大小不能按預期工作

我想要實現的是設置一個按鈕的最小尺寸。 下面是簡化的代碼:

public class MainGameView extends JPanel { 
    public MainGameView(DefaultController controller) { 

     this.controller = controller; 
     CreateUI(); 
    } 

    private void CreateUI() { 
     MenuPanel = new javax.swing.JPanel(); 
     StartGameBtn = new JButton("Start Game"); 

     // Creating menu 
     MenuPanel.setLayout(new BoxLayout(MenuPanel, BoxLayout.Y_AXIS)); 
     MenuPanel.setPreferredSize(new Dimension(200, 200)); 

     StartGameBtn.setAlignmentX(Component.LEFT_ALIGNMENT);  
     StartGameBtn.setMinimumSize(new Dimension(200, 30)); 
     MenuPanel.add(StartGameBtn); 
    } 
} 

所以我的理解,如果容器被分配200個像素的寬度,就應該相應地分配寬度爲200個像素的按鈕。但是按鈕保持相同的大小。我在這裏錯過了什麼嗎?

回答

2

BoxLayout不會水平拉伸組件,它將允許它保持在它的首選寬度。您應該使用橫向拉伸的佈局管理器。例如,基於它看起來像你正在嘗試做的,你可以使用BorderLayout的:

MenuPanel.setLayout(new BorderLayout(0,0)); 
    MenuPanel.setPreferredSize(new Dimension(200, 200)); 
    StartGameBtn.setAlignmentX(Component.LEFT_ALIGNMENT);  
    MenuPanel.add(StartGameBtn, BorderLayout.NORTH); 

這使按鈕,在頂部,保持其天然的首選高度,並且水平延伸以適合MenuPanel的寬度,即使它被調整大小。您也可以查看GridLayout(配置爲1列),我相信這會讓您在垂直列中添加多個組件,並且所有組件都將伸展以適應MainPanel的整個寬度。

3

佈局管理器的一個大問題是,它們都遵循不同的規則來設置組件的大小。這是特別令人沮喪的,因爲擺動確實鼓勵你使用「面板內的面板」方法,使多個面板使用不同的佈局管理器嵌入對方。

例如,BoxLayout不會水平拉伸組件,而是會遵守「首選寬度」。

解決方案?您可以繼續使用帶有面板解決方案的面板,並不斷與佈局經理對抗,也可以使用名爲MigLayout的第三方佈局管理器。

MigLayout非常靈活,易於使用,我認爲它比任何默認的擺動佈局管理器都好得多。此外,如果您使用Google WindowBuilder之類的東西,則可以使用MigLayout和拖放gui構建器,並且仍然可以直接訪問源代碼!

相關問題