Java 使用BoxLayout设置JPanel内部JButton的大小不';I don’我没有按预期工作

Java 使用BoxLayout设置JPanel内部JButton的大小不';I don’我没有按预期工作,java,swing,user-interface,jbutton,Java,Swing,User Interface,Jbutton,最近,我开始用Java进行UI开发;我曾经在WPF中进行UI开发。 Java的一些做法令人困惑 我试图实现的是设置按钮的最小大小。 以下是简化代码: public class MainGameView extends JPanel { public MainGameView(DefaultController controller) { this.controller = controller; CreateUI(); } priv

最近,我开始用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像素的宽度。但是,按钮的大小保持不变。我在这里遗漏了什么吗?

BoxLayout将不会水平拉伸组件,它将允许组件保持其首选宽度。您应该使用水平拉伸的布局管理器。例如,根据您尝试执行的操作,您可以使用BorderLayout:

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

这会将按钮置于顶部,保持其自然的首选高度,并将其水平拉伸以适应菜单面板的宽度,即使调整大小也是如此。您还可以查看GridLayout(配置为1列)我相信这将允许您在一个垂直列中添加多个组件,并且所有组件都将拉伸以适应主面板的整个宽度。

布局管理器的一个大问题是,它们在设置组件大小时都遵循不同的规则。这尤其令人沮丧,因为swing确实鼓励您使用“面板中的面板”方法,即让多个面板使用不同的布局管理器嵌入彼此

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

解决方案是什么?您可以继续使用panels with panels解决方案并不断与layout manager对抗,也可以使用称为的第三方layout manager

MigLayout非常灵活,易于使用,我认为它比任何默认的swing布局管理器都要好得多。此外,如果您使用类似于Google WindowBuilder的东西,您可以将MigLayout与拖放gui builder一起使用,并且仍然可以直接访问源代码