Java - Какой макет Swing я должен использовать? - PullRequest
1 голос
/ 17 января 2012

сегодня у меня небольшая проблема, которая, вероятно, ничего не значит для профессионалов:)

Я хочу, чтобы мои компоненты Swing были в одной горизонтальной линии.Я использовал FlowLayout и изменил размер компонентов в componentResized () в соответствии с размером кадра, но он часто глючил (иногда последний компонент помещался в следующую строку) ... Я решил использовать BoxLayout, но для этого кода:

    down=new JPanel(new BoxLayout(down,BoxLayout.X_AXIS));
    down.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
    down.add(Box.createHorizontalGlue());
    down.setPreferredSize(new Dimension(300,35));

происходит сбой с:

Exception in thread "AWT-EventQueue-0" java.awt.AWTError: BoxLayout can't be shared
at javax.swing.BoxLayout.checkContainer(Unknown Source)
at javax.swing.BoxLayout.invalidateLayout(Unknown Source)
at javax.swing.BoxLayout.addLayoutComponent(Unknown Source)
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at ButtonFrame.<init>(chat.java:278)
at chat$1.run(chat.java:20)
aso...

Я не знаю, что делать, может быть, я могу сделать FlowLayout неспособным сделать 2-ю строку или заставить работать макет коробки?

Спасибо за любые ответы!

Ответы [ 4 ]

5 голосов
/ 17 января 2012

Вставлено при копировании из учебника Swing о BoxLayout s

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

Посмотрите, как панель сначала создается без какого-либо макета, а затем макет устанавливается и создается с помощьюсуществующая панель.Это отличается от вашего

down=new JPanel(new BoxLayout(down,BoxLayout.X_AXIS));

Настройка этой строки (создание двух отдельных операторов, как в примере) удалит исключение.

О да, BoxLayout должен позволить выполнитьваше требование

2 голосов
/ 17 января 2012

FlowLayout или BoxLayout являются менеджерами раскладки. Задача менеджера компоновки состоит в том, чтобы автоматически вычислять положение и размер компонентов, поэтому вам не следует напрямую изменять размер компонентов. Здесь с помощью componentResized () вы получаете уведомление о том, что размер компонента был изменен. Он может быть изменен менеджером макета автоматически. Если вы измените здесь размер ваших компонентов, это может вызвать другую автоматическую процедуру размещения и т. Д.

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

2 голосов
/ 17 января 2012

Взгляните на http://www.miglayout.com/, который сдувает все, что предоставляет Java. Как только вам понадобится что-то сложное, это облегчит ваши жизненные миры.

1 голос
/ 17 января 2012

Я часто нахожу, что GridBagLayout обладает достаточной гибкостью и контролем, чтобы делать то, что мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...