Команда BorderLayout center не будет центрироваться - PullRequest
2 голосов
/ 26 ноября 2011

Я пытаюсь разместить два JButton рядом друг с другом в центре JFrame, что не приведет к изменению размера кнопок при изменении размера JFrame.

Для этого я поместил две кнопки на панели с FlowLayout, который затем помещается на панель с центром BorderLayout.

Однако следующий код не будет отображать выбранную панель в центре BorderLayout.

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class test extends JFrame {

    private JPanel panel1 = new JPanel();
    private JPanel panel2 = new JPanel();
    private JButton button1 = new JButton("one");
    private JButton button2 = new JButton("two");

    public test() {
        panel1.setLayout(new FlowLayout());
        panel1.add(button1);
        panel1.add(button2);

        panel2.setLayout(new BorderLayout());
        panel2.add(panel1, BorderLayout.CENTER);

        this.add(panel2);
    }

    public static void main(String[] args) {
        test frame = new test();
        frame.setVisible(true);
        frame.setSize(400, 400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Ответы [ 3 ]

5 голосов
/ 26 ноября 2011

Установите GridBagLayout на panel1.

 panel1.setLayout(new GridBagLayout());

РЕДАКТИРОВАТЬ:

@ trashgod: я должен выяснить, как это делают ограничения по умолчанию.

Из-за поля GridBagLayout.defaultConstraints :

В этом поле содержится экземпляр ограничений gridbag, содержащий значения по умолчанию, поэтому, если компонент не имеет связанных с ним ограничений gridbag, тогдаКомпоненту будет назначена копия defaultConstraints.

В обычной практике необходимо создать объект GridBagConstraints и задать поля для указания ограничений для каждого объекта.

Цитировать учебник :

Предпочтительным подходом для установки ограничений на компонент является использование варианта Container.add с передачей ему объекта GridBagConstraints

3 голосов
/ 26 ноября 2011

Не кажется интуитивно понятным, ведёт себя правильно.

panel1 назначается столько места на экране, сколько доступно, потому что это единственный компонент внутри panel2. FlowLayout затем размещает компоненты, начиная с верхней части доступного пространства, и помещает компоненты дальше вниз только после того, как заполнит все доступное горизонтальное пространство. Таким образом, вы получаете две кнопки в верхней части рамки.

Вы можете попробовать использовать Box вместо:

public class test extends JFrame {

    private JComponent box = Box.createHorizontalBox();
    private JButton button1 = new JButton("one"); 
    private JButton button2 = new JButton("two"); 

    public test() {
        box.add(Box.createHorizontalGlue());
        box.add(button1);
        box.add(button2);
        box.add(Box.createHorizontalGlue());
        this.add(box);
    }

    ...
}

Горизонтальная коробка автоматически центрирует компоненты по вертикали, и два клеевых компонента занимают любое дополнительное доступное горизонтальное пространство, так что кнопки располагаются в центре коробки.

0 голосов
/ 26 ноября 2011

JPanel использует FlowLayout по умолчанию, а FlowLayout использует центрированное выравнивание по умолчанию ... Мне кажется, это проще, чем переходить к GridBagLayout или даже BoxLayout. Если вы не хотите, чтобы кнопки «оборачивались», когда панель становится для них слишком маленькой, вы можете установить минимальный размер.

package example;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FlowLO extends JFrame
{
    public static void main(String[] args)
    {
        FlowLO flowLO = new FlowLO();
        flowLO.go();
    }
    public void go()
    {
        JPanel centeredPanel = new JPanel();
        centeredPanel.add(new JButton("one"));
        centeredPanel.add(new JButton("two"));
        getContentPane().add(centeredPanel);
        pack();
        setVisible(true);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...