使用BoxLayout设置JPanel内JButton的大小不像预期的那样起作用。

3

最近,我开始在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个回答

3
布局管理器的一个大问题是它们都遵循不同的规则来设置组件的大小。这特别令人沮丧,因为swing真的鼓励您使用“面板内嵌面板”的方法,在其中嵌入使用不同布局管理器的多个面板。
例如,BoxLayout不会水平拉伸组件,而是遵循“首选宽度”。
解决方案?您可以继续使用面板内嵌面板的解决方案,并不断与布局管理器作斗争,或者您可以使用第三方布局管理器MigLayout
MigLayout非常灵活,易于使用,我认为它比任何默认的swing布局管理器都要好得多。此外,如果您使用类似Google WindowBuilder之类的工具,您可以在拖放GUI构建器中使用MigLayout,并仍然直接访问源代码!

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的整个宽度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接