使用BoxLayout在JPanel中设置JButton的大小不能按预期工作

时间:2011-11-04 16:33:20

标签: java swing user-interface jbutton

最近,我开始用Java进行UI开发;我曾经在WPF中进行UI开发。 关于Java做事方式的一些事情令人困惑。

我想要实现的是设置按钮的最小尺寸。 这是简化的代码:

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 个答案:

答案 0 :(得分:3)

布局管理器的一个主要问题是,他们都遵循不同的规则来设置组件的大小。这尤其令人沮丧,因为swing真的鼓励你使用“面板内的面板”方法,让多个面板使用不同的布局管理器相互嵌入。

例如,BoxLayout不会水平拉伸组件,而是遵循“首选宽度”。

解决方案?您可以继续使用面板解决方案面板并不断与布局管理器对抗,也可以使用称为MigLayout的第三方布局管理器。

MigLayout非常灵活,易于使用,我认为它比任何默认的swing布局管理器都要好得多。此外,如果你使用像Google WindowBuilder这样的东西,你可以使用拖放gui构建器的MigLayout,并且仍然可以直接访问源代码!

答案 1 :(得分: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的整个宽度。