GridBagLayout неравного размера столбца из-за предпочтительного размера JLabel
У меня есть окно, которое использует GridBagLayout
как его макет. На левой стороне некоторые JComboBox
es с некоторыми ярлыками, описывающими, что они есть, и справа, несколько 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, может быть сложно. Установка шрифта, цвета и границы может быть достаточной в некоторых системах, но недостаточной в других.