2015-04-02 5 views
-1

GridBagLayout не работает должным образом. Я не могу найти, где я делаю ошибку. Я знаю, что где-то я делаю какую-то глупую ошибку, но не могу ее найти.GridBagLayout не работает должным образом

Здесь я создал 3 кнопки, 4 текстовые поля и 3 поля со списком, и я хочу выровнять их в правильном порядке, используя GridBagLayout.

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

GridBagConstraints c = new GridBagConstraints(); 
      JPanel secondPanel = new JPanel(); 
      f=new JFrame("Server Side"); 
      b=new JButton("3DES ALGO"); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 1; 
      c.gridy = 0; 
      secondPanel.add(b, c);  
      b1=new JButton("Browse"); 
      c.gridx = 2; 
      c.gridy = 0; 
      secondPanel.add(b1, c); 
       b2=new JButton("Color"); 
      c.gridx = 0; 
      c.gridy = 0; 
      secondPanel.add(b2, c); 
      comboBox1 = new JComboBox(s); 
      c.gridx = 0; 
      c.gridy = 1; 
      secondPanel.add(b, c); 
       comboBox2 = new JComboBox(s); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 1; 
      c.gridy = 1; 
      secondPanel.add(b, c); 
       comboBox3 = new JComboBox(s); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 2; 
      c.gridy = 1; 
      secondPanel.add(b, c); 

      b10=new JButton("OK"); 

      tf=new TextField(); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 2; 
      c.gridy = 1; 
      secondPanel.add(tf, c); 

      tf1=new TextField(); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 0; 
      c.gridy = 2; 
      secondPanel.add(tf1, c); 
       tf2=new TextField(); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 1; 
      c.gridy = 2; 
      secondPanel.add(tf2, c); 
       tf3=new TextField(); 
      c.fill = GridBagConstraints.HORIZONTAL; 
      c.gridx = 2; 
      c.gridy = 2; 
      secondPanel.add(tf3, c); 

      b.addActionListener(this); 
      b1.addActionListener(this); 
      b2.addActionListener(this); 

      b.setBounds(200,0,330,50); 
      b1.setBounds(500,100,90,30); 
      b2.setBounds(0,0,70,30); 

      Container content = f.getContentPane(); 
      content.setBackground(Color.RED); 
      b.setForeground(Color.white); 
      b.setBackground(Color.black); 
      b1.setForeground(Color.white); 
      b1.setBackground(Color.black); 
      b2.setForeground(Color.white); 
      b2.setBackground(Color.black); 
tf.setBackground(Color.CYAN); 
      tf1.setBackground(Color.GRAY); 
      tf1.setForeground(Color.white); 

      tf2.setBackground(Color.GRAY); 
      tf2.setForeground(Color.white); 
       tf3.setBackground(Color.GRAY); 
      tf3.setForeground(Color.white); 

      f.add(b); 
      f.add(b1); 
      f.add(b2); 


      secondPanel.setLayout(new GridBagLayout()); 
      secondPanel.add(comboBox1); 
      secondPanel.add(comboBox2); 
      secondPanel.add(comboBox3); 
      f.add(tf); 
      f.add(tf1); 
      f.add(tf2); 
      f.add(tf3); 
       f.add(secondPanel); 
      f.setLayout(new GridBagLayout()); 

      f.addWindowListener(new WindowEventListener()); 
      f.pack(); 

      f.setVisible(true); 
+2

«но он не работает должным образом» - это не говорит нам ничего о том, что вы ожидали что происходит. –

+1

'Я хочу упорядочить их в правильном порядке' - Мы не знаем, каково ваше определение правильного порядка. – camickr

+0

Я хочу выделить 3 кнопки в одной строке, а затем в следующей строке я хочу иметь 3 выпадающих списков. и в последней строке я хочу иметь 3 TextFields – rocky

ответ

1

Сетки 0 на основе, так что ваш основной код будет:

c.gridx = 0; 
c.gridy = 0; 
panel.add(b1, c); 
c.gridx = 1; 
panel.add(b2, c); 
c.gridx = 2; 
panel.add(b3, c); 
c.gridx = 0; 
c.gridy = 1; 
panel.add(combo1, c) 
c.gridx = 1; 
panel.add(combo2, c); 
... 
+0

На самом деле, когда создается GridBagConstraints, gridx и gridy инициализируются GridBagConstraints.RELATIVE. – VGR

+0

@ vgr, oops, я думаю, это хорошо, что я всегда вручную устанавливал gridx и gridy значения 0. Сообщение обновлено, спасибо. – camickr

1

Я уверен, что вам необходимо установить макет в GridBagLayout перед добавлением ваших компонентов в secondPanel.

Я также вижу, что вы добавляете свои JComboBoxes без каких-либо ограничений вообще, что почти наверняка не то, что вы хотите сделать.

Кроме того, я вижу, что вы вызываете setBounds. Не делай этого. Задача LayoutManager - устанавливать границы дочерних компонентов, а не ваши.

Хотя документация не такая ясная, как это могло бы быть, GridBagConstraints намного проще использовать, когда вы используете GridBagConstraints.RELATIVE и GridBagConstraints.REMAINDER. gridx и gridy по умолчанию установлены RELATIVE, вероятно, потому, что это обычно самый простой вариант использования.

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

Итак, если вы хотите выложить свои кнопки и поля в три ряда, вы можете сделать это:

b = new JButton("3DES ALGO"); 
b1 = new JButton("Browse"); 
b2 = new JButton("Color"); 

b.addActionListener(this); 
b1.addActionListener(this); 
b2.addActionListener(this); 

comboBox1 = new JComboBox(s); 
comboBox2 = new JComboBox(s); 
comboBox3 = new JComboBox(s); 

tf = new JTextField(10); 
tf1 = new JTextField(10); 
tf2 = new JTextField(10); 
tf3 = new JTextField(10); 

GridBagConstraints c = new GridBagConstraints(); 
JPanel secondPanel = new JPanel(new GridBagLayout()); 

c.fill = GridBagConstraints.HORIZONTAL; 

// Components are easier to see and use if there is some space between them. 
c.insets.right = 6; 
c.insets.bottom = 6; 

// At this point, c.gridx and c.gridy are both GridBagConstraints.RELATIVE. 
// c.gridwidth and c.gridheight are 1. 

secondPanel.add(b, c); 
secondPanel.add(b1, c); 
// A gridwidth of REMAINDER means "This is the last component on this row." 
c.gridwidth = GridBagConstraints.REMAINDER; 
secondPanel.add(b2, c); 

// Since the last component was added with a width of REMAINDER, the next 
// component is automatically on the next row, as long as gridx and gridy 
// are still set to GridBagConstraints.RELATIVE. 

c.gridwidth = 1; 
secondPanel.add(tf, c); 
secondPanel.add(tf1, c); 
secondPanel.add(tf2, c); 
c.gridwidth = GridBagConstraints.REMAINDER; 
secondPanel.add(tf3, c); 

c.gridwidth = 1; 
secondPanel.add(comboBox1, c); 
secondPanel.add(comboBox2, c); 
c.gridwidth = GridBagConstraints.REMAINDER; 
secondPanel.add(comboBox3, c);