Использование BoxLayout в качестве вертикального FlowLayout для хранения JPanel

Я хочу иметь вертикальную FlowLayout для размещения моего JPanels. Многие люди предлагают использовать BoxLayout. Однако я понимаю, что его поведение не совсем такое же, как у FlowLayout

FlowLayout

введите здесь описание изображения

введите здесь описание изображения

BoxLayout с осью Y

введите здесь описание изображения

введите здесь описание изображения

Как видите, в FlowLayout, когда я растягиваю ширину родительской панели, ширина ее дочерних панелей остается прежней.

Однако в BoxLayout, когда я увеличиваю высоту родительской панели, высота дочерних панелей меняется!. Кажется, это похоже на поведение 1 столбца 2 строки GridLayout. Это не то, чего я хочу.

Есть ли способ предотвратить это?

Я стараюсь иметь вертикальный заполнитель сверху и снизу родительской панели.

new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767));

Но это мало помогает. Высота моих двух дочерних панелей все еще растягивается, когда я меняю высоту родителя.


person Cheok Yan Cheng    schedule 11.09.2013    source источник


Ответы (3)


  • посмотрите, как работает BoxLayout (принимая минимальный, максимальный и предпочтительный размер, затем изменение размера зависит от этого значения),

  • по сравнению с FlowLayout (принимая только PreferredSize, дочерний элемент не может быть изменен с помощью контейнера)

введите здесь описание изображения

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class BoxStructAndJComponents {

    private JFrame frame;
    private JPanel intro;
    private JPanel name;

    public BoxStructAndJComponents() {
        frame = new JFrame("JFrame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JComponent newContentPane = createUI();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);
        frame.pack();
        frame.setVisible(true);
    }

    private JPanel createUI() {
        intro = new JPanel() {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(100, 100);
            }
        };
        intro.setBackground(Color.red);
        //intro.setLabelFor(name);
        name = new JPanel() {
            @Override
            public Dimension getMinimumSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(100, 100);
            }

            @Override
            public Dimension getMaximumSize() {
                return new Dimension(100, 100);
            }
        };
        name.setBackground(Color.blue);
        final JButton button = new JButton("Pick a new name...");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
            }
        });
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 10, 20));
        intro.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        name.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        button.setAlignmentX(JComponent.CENTER_ALIGNMENT);
        panel.add(intro);
        //panel.add(Box.createVerticalStrut(5));
        panel.add(Box.createHorizontalStrut(5));
        panel.add(name);
        panel.add(Box.createRigidArea(new Dimension(150, 10)));
        panel.add(button);
        return panel;
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                BoxStructAndJComponents listDialogRunner = new BoxStructAndJComponents();
            }
        });
    }
}
person mKorbel    schedule 11.09.2013

Вы должны использовать Glue (см.: http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html#glue).

person ivan.a.bovin    schedule 11.09.2013

Простой и гибкий способ добиться такого поведения — использовать GridBagLayout:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestGridBagLayout {

    protected void initUI1() {
        final JFrame frame = new JFrame("Grid bag layout");
        frame.setTitle(TestGridBagLayout.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        // gbc.weighty = 1.0; Uncomment this line if you want the labels to spread vertically
        for (int i = 0; i < 10; i++) {
            panel.add(new JLabel("Label " + (i + 1)), gbc);
        }
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TestGridBagLayout test = new TestGridBagLayout();
                test.initUI1();
            }
        });
    }

}
person Guillaume Polet    schedule 11.09.2013