Проблема Swing BoxLayout -Не могу заставить наполнители выполнять свою работу

То, что я пытаюсь сделать

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

Я знаю, что могу установить предпочтительный размер или максимальный размер для компонентов, но следующий код - это просто средство воспроизведения, и я не могу жестко кодировать или максимизировать размер компонентов, которые на самом деле являются более сложными и динамическими . И я просто не могу использовать BorderLayout с позицией BorderLayout.TOP , потому что полосы прокрутки никогда не будут отображаться, если я это сделаю. И мне могут понадобиться панели прокрутки.


Что я пробовал

Итак, я попытался использовать заполнители в BoxLayout , как описано в Использование невидимых компонентов в качестве заполнителя , но это просто не работает. Хотя в документации Oracle это казалось именно тем, что мне нужно. Вот мои попытки:

    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;


    public class TestBoxLayout implements Runnable {

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TestBoxLayout());
        }

        @Override
        public void run() {
            JFrame f = new JFrame("test box layout");

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

            b.add(new JTextField("field 1"));
            b.add(new JTextField("field 2"));
            b.add(new JTextField("field 3"));
            b.add(Box.createVerticalGlue());

            f.setContentPane(b);
            f.setSize(500, 200);
            f.setVisible(true);
        }

    }

Вот результат, который я получил:

Fillers are not working


Вторая попытка

Я попытался использовать класс Box вместо JPanel с BoxLayout , но визуальный результат точно такой же. Вот моя вторая попытка:

    import javax.swing.Box;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;


    public class TestBox implements Runnable {

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TestBox());
        }

        @Override
        public void run() {
            JFrame f = new JFrame("test box");

            Box b = Box.createVerticalBox();

            b.add(new JTextField("field 1"));
            b.add(new JTextField("field 2"));
            b.add(new JTextField("field 3"));
            b.add(Box.createVerticalGlue());

            f.setContentPane(b);
            f.setSize(500, 200);
            f.setVisible(true);
        }

    }

Что бы я хотел сделать

Кто-нибудь знает, как я могу исправить эти наполнители и заставить их работать? Исправить данный код было бы просто фантастически.

Это рисунок, который я сделал с помощью краски, он показывает, что я хотел бы получить в результате: Expected result

7
задан Joel 29 June 2011 в 13:06
поделиться