如何修复 GUI 组件"leaving"其面板或占用它们应该占用的更多空间?



我正在尝试为游戏制作GUI。我是Java的新手,尤其是GUI。下面的代码是一个片段,它应该制作一个带有嵌套面板的JFrame,用于组织。在我将按钮添加到按钮面板之前,它一直有效。它们最终出现在boardBckg面板上。如果我设法将它们放在正确的面板上,JTextField就会消失,或者占据整个屏幕。在过去的两天里,我一直在编写这部分代码,我真的可以使用GUI技巧了。

private void makeWindow()
{
boardPanel = new JPanel();
boardBckg = new JPanel();
menuPanel = new JPanel();
save = new JButton("Save");
save.setSize(Buttons);
load = new JButton("Load");
load.setSize(Buttons);
replay = new JButton ("Replay");
replay.setSize(Buttons);
words = new JTextField();
frame = new JFrame(title);
boardPanel.setSize(PANEL);
boardPanel.setMaximumSize(MAX);
boardPanel.setMinimumSize(MIN);
boardPanel.setLayout(new GridLayout(m,n));
boardBckg.setSize(1000, 1000);
boardBckg.setBackground(Color.cyan);
boardBckg.add(boardPanel, BorderLayout.CENTER);
frame.setSize(1500, 1000);
frame.setResizable(false);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BoxLayout vertical = new BoxLayout(menuPanel, BoxLayout.Y_AXIS);
menuPanel.setSize(500, 1000);
menuPanel.setBackground(Color.blue);
menuPanel.setLayout(vertical);
frame.add(boardBckg);
frame.add(menuPanel);
JPanel iGiveUp = new JPanel();
iGiveUp.setBackground(Color.black);
JPanel buttons = new JPanel();
buttons.setBackground(Color.darkGray);
buttons.add(save);
buttons.add(load);
buttons.add(replay);
menuPanel.add(iGiveUp);
menuPanel.add(buttons);
iGiveUp.add(words);
boardBckg.add(boardPanel, BorderLayout.CENTER);

JPanel的默认布局是FlowLayout。将零部件添加到面板时,不能仅指定BorderLayout约束。

frame.add(boardBckg);
frame.add(menuPanel);

框架(的内容窗格)的默认布局是BorderLayout。如果您没有指定约束,则该组件将添加到BorderLayout.CENTER。问题是只有一个组件可以添加到CENTER,因此您只能看到添加的最后一个组件。

frame.setVisible(true);

在包装框架并使其可见之前,应将组件添加到框架中。因此,上面的语句应该是构造函数中的最后一个语句。

我不知道你想要的布局是什么,但你需要从简单的开始,并利用框架的默认BorderLayout。

所以你的基本逻辑可能是这样的:

JPanel menuPanel = new JPanel()
menuPanel.setLayout(new BoxLayout(menuPanel, BoxLayout.Y_AXIS));
menuPanel.add(...);
menuPanel.add(...);
JPanel center = new JPanel();
center.setLayout(...);
center.setBackground( Color.BLUE );
center.add(...);
frame.add(menuPanel, BorderLayout.LINE_START);
frame.add(center, BorderLayout.CENTER);
frame.pack();
frame.setVisible( true );

要点是从逻辑上分解面板,然后一次一个地将它们添加到框架中。因此,首先得到菜单及其子组件添加到框架中的正确位置。然后可以添加CENTER面板及其子零部件。

最新更新