2015-08-20 2 views
3

Я работаю с java swing LayoutManager GridBagLayout и столкнулся с этой проблемой. Я хочу, чтобы макет, как этотGridBagLayout ширина сетки не работает должным образом

ACC
BB

Но получить макет, как этот

ACC
B

A и B занимают одинаковое число столбцов, несмотря на B, имеющие ширина сетки 2, где ширина сетки A равна 1. Я не думаю, что между A, B и C может быть исчезающе малый столбец, потому что C начинается в столбце 1. Проблема не возникает, если ширина сетки C равна 1 вместо 2. I ' m сбиты с толку выходом.

Почему это происходит/как я могу это исправить?

JFrame test = new JFrame(); 
test.setSize(800,800); 
test.setLayout(new GridBagLayout()); 
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

GridBagConstraints c; 

c = new GridBagConstraints(); 
c.gridx=0; 
c.gridy=0; 
c.fill = GridBagConstraints.BOTH; 
c.weightx = 1; 
c.weighty = 1; 
test.add(new JButton("A"), c); 

c = new GridBagConstraints(); 
c.gridx=0; 
c.gridy=2; 
c.gridwidth=2; 
c.fill = GridBagConstraints.BOTH; 
c.weightx = 1; 
c.weighty = 1; 
test.add(new JButton("B"), c); 

c = new GridBagConstraints(); 
c.gridx=1; 
c.gridy=0; 
c.gridwidth=2; 
c.gridheight=2; 
c.fill = GridBagConstraints.BOTH; 
c.weightx = 2; 
c.weighty = 2; 
test.add(new JButton("C"), c); 

test.setVisible(true); 

ответ

3

Я знаю, как вы себя чувствуете ... Кажется, GridBagLayout уменьшает ширину столбцов в 0, когда они не заполнены 1x1 компонентом. Я не знаю, если следующее является наиболее эффективным решением, но это работает (добавив два манекена JPanel к «надуть» колонки 1 и 2):

JFrame test = new JFrame(); 
test.setSize(800,800); 
test.setLayout(new GridBagLayout()); 
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

GridBagConstraints c; 

c = new GridBagConstraints(); 
c.gridx=0; 
c.gridy=0; 
c.fill = GridBagConstraints.BOTH; 
c.weightx = 1; 
c.weighty = 1; 
test.add(new JButton("A"), c); 

c = new GridBagConstraints(); 
c.gridx=0; 
c.gridy=1; 
c.gridwidth=2; 
c.fill = GridBagConstraints.BOTH; 
c.weightx = 1; 
c.weighty = 1; 
test.add(new JButton("B"), c); 

c = new GridBagConstraints(); 
c.gridx=1; 
c.gridy=0; 
c.gridwidth=2; 
c.gridheight=1; 
c.fill = GridBagConstraints.BOTH; 
c.weightx = 2; 
c.weighty = 2; 
test.add(new JButton("C"), c); 

c = new GridBagConstraints(); 
c.gridx=1; 
c.gridy=2; 
c.gridwidth=1; 
c.gridheight=0; 
c.fill = GridBagConstraints.HORIZONTAL; 
c.weightx = 1; 
c.weighty = 0; 
test.add(new JPanel(), c); 

c = new GridBagConstraints(); 
c.gridx=2; 
c.gridy=3; 
c.gridwidth=1; 
c.gridheight=0; 
c.fill = GridBagConstraints.HORIZONTAL; 
c.weightx = 1; 
c.weighty = 0; 
test.add(new JPanel(), c); 

test.setVisible(true); 
+0

Вы также должны установить 'weightx = 1; weighty = 0', если вы используете 'gridwidth> 1' или' weightx = 0; weighty = 1', если вы используете 'gridheight> 1', поэтому дополнительный компонент не использует пробел. Жаль, что я не видел вашего ответа несколько дней назад :) – Matthieu