GUI, BoxLayout добавление панели

Изучение BoxLayout и GUI в целом. Я хочу разместить панель на раме. Позже добавлю идентичную панель и протестирую BoxLaoyout. Но я не могу понять, почему этот код выдает не панель размером 200x400, а просто красную точку в середине левой части кадра (с координатами около (300,0)).

public class View extends JFrame {
    public View(){
        this.setPreferredSize(new Dimension(600, 600));
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.pack();

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));

        Border border = BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.RED, Color.BLACK);

        JPanel p1 = new JPanel();
        p1.setSize(200, 400);
        p1.setBorder(border);
        p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));


        panel.add(p1);

        this.add(panel);
        this.setVisible(true);
    }

}

person Michael    schedule 19.07.2014    source источник
comment
См. раздел Следует ли избегать использования методов set(Preferred|Maximum|Minimum)Size в Swing? (Да.)   -  person Andrew Thompson    schedule 19.07.2014


Ответы (1)


Менеджер компоновки (BoxLayout) использует предпочтительный размер компонентов контейнера, которым он управляет. По умолчанию предпочтительный размер пустого JPanel равен 0x0, добавление границы привело к предпочтительному размеру, близкому к 2x2.

При использовании менеджеров компоновки вызов setSize не имеет смысла, так как менеджер компоновки переопределит все, что вы укажете, когда контейнер будет повторно проверен.

Обновлено

Создается впечатление, что комбинация обоих BoxLayout играет против вас. Если я удалю второй BoxLayout из p1, он, кажется, будет работать нормально.

Кроме того, BoxLayout, похоже, хочет работать с максимальным размером компонента...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

public class View extends JFrame {

    public View() {
        this.setPreferredSize(new Dimension(600, 600));
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.pack();

        JPanel panel = new JPanel();
        panel.setBorder(new LineBorder(Color.BLUE));
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));

        Border border = BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.RED, Color.BLACK);

        JPanel p1 = new JPanel() {
            public Dimension getMaximumSize() {
                return new Dimension(200, 400);
            }
        };
        p1.setBorder(border);
        p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS));

        panel.add(p1);

        this.add(panel);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new View();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
person MadProgrammer    schedule 19.07.2014
comment
Я уже экспериментировал с предпочтительным размером. Вместо setSize я использовал эту строку кода: p1.setPreferredSize(new Dimension(200, 400)); Но результат был тот же. - person Michael; 19.07.2014