Как исправить компоненты графического интерфейса, «оставляя» свои панели или занимая больше места, чем они должны? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь сделать графический интерфейс для игры. Я очень новичок в 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 голосов
/ 16 января 2019
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 и ее дочерние компоненты.

...