GridBagLayout неравного размера столбца из-за предпочтительного размера JLabel

У меня есть окно, которое использует GridBagLayout как его макет. На левой стороне некоторые JComboBoxes с некоторыми ярлыками, описывающими, что они есть, и справа, несколько JPanelс и JLabelдать описание выбранного пункта в соответствующемJComboBox, Оба столбца имеют одинаковый вес по горизонтали. Тем не менее, описание, которое являетсяJLabel (жирным шрифтом выше), хотя его текст <html>теги, чтобы сделать это, он устанавливает свой предпочтительный размер, чтобы соответствовать всей его длине на одной строке, что делает его слишком широким, и столбцы не изменяют размер должным образом.

Макет выглядит так:

┌────────────────────┬────────────────────┐
│       JLabel       │                    │
├────────────────────┤                    │
│                    │ Description JPanel │
│     JComboBox      │                    │
│                    │                    │
├────────────────────┼────────────────────┤
│       JLabel       │                    │
├────────────────────┤                    │
│                    │ Description JPanel │
│     JComboBox      │                    │
│                    │                    │
├────────────────────┼────────────────────┤
│       JLabel       │                    │
├────────────────────┤    *Bothersome*    │
│                    │                    │
│     JComboBox      │      *JLabel*      │
│                    │                    │
├────────────────────┴────────────────────┤
│             JButton (Done)              │
└─────────────────────────────────────────┘

То, что я хочу знать,как я могу сделатьGridBagLayoutигнорировать предпочтительный размер, или как я могу сделать два столбца равными, независимо от компонентов в них?

Заранее спасибо.

3 ответа

Вы можете сделать что-то вроде этого:

JPanel mainPanel = new JPanel(new GridLayout(1,2));
mainPanel.add(leftPanel, BorderLayout.EAST);
mainPanel.add(rightPanel, BorderLayout.WEST);
mainPanel.add(buttonsPanel, BorderLayout.SOUTH);

leftPanel а также rightPanel включите то, что вы описали.
В этом случае каждая сторона получит 50% вашего экрана.

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

Вы можете попробовать дать каждому столбцу weightx из 0.5, это будет выделять 50% оставшегося доступного пространства для каждого столбца

Для более подробной информации ознакомьтесь с разделом Как использовать GridBagLayout.

Вы можете разбить ваш макет на две части и использовать GridLayout для каждого столбца, используя отдельные JPanelс GridBagLayout для строк, но это позволит рядам стать невыровненными.

Другой выбор - использовать что-то вроде MigLayout....

Обычно предпочтительный размер HTML в Swing составляет одну (очень широкую) строку. И да, это расстраивает.

Если предположить, label3 а также list3 третий левый JLabel и JComboBox, соответственно, в левой части макета, попробуйте это:

htmlLabel.setPreferredSize(
    new Dimension(htmlLabel.getMinimumSize().width,
                  label3.getPreferredSize().height +
                  list3.getPreferredSize().height));

Возможно, вы захотите добавить любые вертикальные вставки, используемые в вашем GridBagLayout между label3 и list3, к вычислению высоты.

Другой вариант - использовать не редактируемую JEditorPane в JScrollPane вместо JLabel. Это позаботится об упаковке, но заставить его выглядеть точно так же, как JLabel, может быть сложно. Установка шрифта, цвета и границы может быть достаточной в некоторых системах, но недостаточной в других.

Другие вопросы по тегам