如何修复GUI组件“离开”其面板或占用其应有的更多空间?

时间:2019-01-16 17:09:34

标签: java swing user-interface jpanel layout-manager

我正在尝试制作游戏的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);

1 个答案:

答案 0 :(得分:0)

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面板及其子组件。