Как центрировать JLabel и JButton в BoxLayout

Я хочу создать простое меню со сложными уровнями

Снимок экрана

Следующие несколько строк кода — это конструктор.

super();

setMinimumSize(new Dimension(600, 300));

setMaximumSize(new Dimension(600, 300));

setPreferredSize(new Dimension(600, 300));

setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

addButtons();

Метод addButtons() добавить кнопки, которые вы видите на скриншоте:

add(Box.createVerticalGlue());

addLabel("<html>Current level <b>" + Game.instance()
                                         .getLevelString() +
         "</b></html>");

add(Box.createVerticalGlue());

addButton("Easy");

add(Box.createVerticalGlue());

addButton("Normal");

add(Box.createVerticalGlue());

addButton("Hard");

add(Box.createVerticalGlue());

addButton("Back");

add(Box.createVerticalGlue());

Метод addButton()

private void addButton(String text)
{
    JButton button = new JButton(text);
    button.setAlignmentX(JButton.CENTER_ALIGNMENT);
    button.setFocusable(false);

    add(button);
}

И addLabel()

private void addLabel(String text)
{
    JLabel label = new JLabel(text, JLabel.CENTER);

    add(label);
}

Я не знаю, как выровнять все элементы по центру. Это проблема для меня. Дополнительная проблема заключается в том, что когда я меняю текст сложного уровня на JLabel, он может измениться на простой «Текущий уровень EASY». Затем JButtons перемещают много пикселей правильно, и я не знаю, почему.


person ventaquil    schedule 01.05.2016    source источник


Ответы (1)


Второй параметр в public JLabel(String text, int horizontalAlignment) предназначен для определения текстовой позиции метки. Вам необходимо установить выравнивание компонента JLabel методом setAlignmentX.

private void addLabel(String text) {
    JLabel label = new JLabel(text, JLabel.CENTER);
    label.setAlignmentX(JLabel.CENTER_ALIGNMENT);
    add(label);
}

Изменить:

Ваша вторая проблема странная. Я не знаю, почему это происходит, но я думаю, что создание второй панели для кнопок решит вашу проблему.

в конструкторе используйте макет границы:

super();

//set size

setLayout(new BorderLayout());

addButtons();

addButtons() метод:

//you can use empty border if you want add some insets to the top
//for example: setBorder(new EmptyBorder(5, 0, 0, 0));

addLabel("<html>Current level <b>" + Game.instance()
                                     .getLevelString() +
     "</b></html>");

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.PAGE_AXIS));

buttonPanel.add(Box.createVerticalGlue());

buttonPanel.add(createButton("Easy"));

buttonPanel.add(Box.createVerticalGlue());

//Add all buttons

add(buttonPanel, BorderLayout.CENTER);

createButton() метод

private JButton createButton(String text)
{
    JButton button = new JButton(text);
    button.setAlignmentX(JButton.CENTER_ALIGNMENT);
    button.setFocusable(false);

    return button;
}

addLabel() метод

private void addLabel(String text)
{
    JLabel label = new JLabel(text, JLabel.CENTER);
    add(label, BorderLayout.NORTH);
}
person rdonuk    schedule 01.05.2016
comment
Хорошо, это работает, но когда я меняю уровень (и текст в JLabel), мои кнопки перемещаются на несколько пикселей к правому краю. - person ventaquil; 01.05.2016
comment
setAlignmentX тоже помог мне - person Michal - wereda-net; 16.03.2021