最近,我开始用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像素的宽度。但按钮保持相同的大小。我在这里错过了什么吗?
答案 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的整个宽度。