[英]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.