繁体   English   中英

使用BoxLayout在JPanel中设置JButton的大小无法正常工作

[英]Setting size of JButton inside JPanel with BoxLayout doesn't work as expected

最近,我开始用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不会水平拉伸组件,而是坚持“首选宽度”。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM