2014-01-04 2 views
0

Я пытаюсь сделать довольно простой макет, что было бы очень легко в каком-то другом менеджере компоновки. Однако мне нужно, чтобы он работал для GridBagLayout. После того, как фрагмент кода:Компонент занимает только один столбец в GridBagLayout

GridBagConstraints c = new GridBagConstraints(); 

JPanel smallLogoPanel = new JPanel(); 
smallLogoPanel.setBorder(new LineBorder(Color.red, 1));//for visualizing components' display are 
smallLogoPanel.setSize(50, 50); 
c.gridx = 0; 
c.gridy = 0; 
c.gridwidth = 1; 
c.gridheight = 2; 
c.weightx = 0.01; 
c.weighty = 0.1; 
c.fill = GridBagConstraints.BOTH; 

JLabel smallLogoLabel = new JLabel(some code to get ImageIcon); 
smallLogoPanel.add(smallLogoLabel); 
this.infoPanel.add(smallLogoPanel, c); 

JLabel label1 = new JLabel("Label 1"); 
label1.setFont(new Font("Verdana", Font.BOLD, 30)); 
label1.setBorder(new LineBorder(Color.red, 1)); 
c.gridx = 1; 
c.gridy = 0; 
c.gridwidth = 9; 
c.gridheight = 1; 
c.weightx = 0.99;//for some reason smallLogoLabel takes much more space if this weightx is any smaller 
c.weighty = 0.075; 
this.infoPanel.add(label1, c); 

JLabel label2 = new JLabel("Label 2"); 
label2.setFont(new Font("Verdana", Font.BOLD, 10)); 
label2.setBorder(new LineBorder(Color.red, 1)); 
c.gridx = 1; 
c.gridy = 1; 
c.gridwidth = 9; 
c.gridheight = 1; 
c.weightx = 0.99; 
c.weighty = 0.025; 
this.infoPanel.add(label2, c); 

... Я получаю такой результат:

result 1

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

JLabel label3 = new JLabel("Label 3"); 
label3.setFont(new Font("Verdana", Font.BOLD, 20)); 
label3.setBorder(new LineBorder(Color.red, 1)); 
c.gridx = 0; 
c.gridy = 2; 
c.gridwidth = 5; 
c.gridheight = 1; 
c.weightx = 0.5; 
c.weighty = 0.05; 
c.anchor = GridBagConstraints.CENTER; 
this.infoPanel.add(label3, c); 

JLabel label4 = new JLabel("Label 4"); 
label4.setFont(new Font("Verdana", Font.BOLD, 20)); 
label4.setBorder(new LineBorder(Color.red, 1)); 
c.gridx = 5; 
c.gridy = 2; 
c.gridwidth = 5; 
c.gridheight = 1; 
c.weightx = 0.5; 
c.weighty = 0.05; 
c.insets.left = 0; 
this.infoPanel.add(label4, c); 

... результат выглядит следующим образом:

enter image description here

Ширина верхнего ряд становится различной, особенно панель со значком становится шире. Другая проблема - нижняя строка. Я ожидал, что обе метки будут иметь одинаковую ширину. Однако кажется, что левый занимает только 1 столбец, который имеет ту же ширину, что и панель со значком.

Я был бы очень рад, что я мог бы помочь мне с этим, так как я полностью застрял сейчас.

+0

Пожалуйста, отредактируйте вопрос с описанием, если эти JComponents могут/будут изменяться по размеру, очень важно для хорошего ответа. – mKorbel

+0

Единственный компонент, который имеет свой размер, представляет собой панель со значком. Кроме того, каждый компонент просто заполняет остальную часть области, используя c.fill = GridBagConstraints.BOTH – lebryant

ответ

1

Все компоненты в одном столбце GridBagLayout имеют точно такие же weightx: максимальный вес любых GridBagConstraints, принадлежащих любому компоненту в этом столбце.

Первоначально весовой столбец 0 составлял 0,01. Но затем вы добавили что-то еще в столбце 0, в другой строке, с весом 0,5, поэтому теперь все компоненты в столбце 0 обрабатываются GridBagLayout, как если бы они имели вес x 0,5.

Те же правила применяются к строкам и значениям weighty.

Кстати, распространенное заблуждение, что gridwidth = 9 может сделать ячейку в девять раз шире, чем было бы, если бы ее ограничения были только gridwidth = 1. Это не то, что на самом деле происходит. Ширина сетки 9 не будет более широкой, если только другая строка не содержит непустых ячеек в этих столбцах. Это связано с тем, что размеры ячейки GridBagLayout являются гибкими, а их ширина равна нулю, если они не содержат компонентов. Только весы определяют относительный размер клеток. Ширина сетки и gridheight нет.

+0

Я знаю, что «gridwidth» не означает, что нужно указать ширину в пикселях. Намерение, почему я использовал gridwidth = 9, мне понадобится 10 столбцов на предстоящих шагах. В любом случае, ваш совет о непустых ячейках был очень полезен, и я верю, что смогу продолжить отсюда сам. Ура! – lebryant

Смежные вопросы