2016-02-09 4 views
1

Я пытаюсь создать сетку размером 10 х 10 идеально квадратных JButtons без промежутков между ними. Я считаю, что для достижения этого единственным решением является GridBagLayout. Тем не менее, я застрял на первом шаге - я не могу заставить их появляться, когда я использую цикл. Вот что у меня есть.JButtons не отображается в GridBagLayout

класса с основной функцией():

public class PixelArtist { 
    public static void main(String[] args) { 
     try { 
      PixelArtistGUI frame = new PixelArtistGUI(); 
      frame.setVisible(true); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

GUI Handler класс:

public class PixelArtistGUI extends JFrame { 
    public PixelArtistGUI() { 
     setTitle("PixelArtist"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 

     JPanel contentPane = new JPanel(new GridBagLayout()); 
     this.add(contentPane); 
     contentPane.setSize(500, 500); 
     GridBagConstraints c = new GridBagConstraints(); 

     JButton b; 

     for (int j = 0; j < 10; j++) { 
      for (int i = 0; i < 10; i++) { 
       b = new JButton(); 
       c.gridx = i; 
       c.gridy = j; 
       contentPane.add(b,c); 
      } 
     } 

    } 
} 

Все вышесказанное делает открыт очень маленький, казалось бы пустым JFrame показано здесь:

Buttons not appearing in JFrame

Последнее, что я сделал, я добавил contentPane.setSize(500, 500);, но это, похоже, не имеет никакого значения.

Я уверен, что это что-то простое - заблаговременно за помощь.

+1

Вы не добавляете контентную рамку в свой фрейм. – FredK

+0

@zZShort_CircuitZz Попробуйте вызвать 'this.pack()' или 'this.setSize (...)' * после * for-loop. –

+0

Ага, который сделал это! Я новичок в этой функции. Спасибо. –

ответ

3

Это должно показать что-то (я тестировал). Проверьте линии // <<<<<< где я добавил заявление:

  • Установите панель в качестве панели содержимого
  • Установите предпочтительный размер для панели содержимого
  • Calling пакета с размером кадра до предпочтительного размера
  • Показать рамку с помощью SwingUtilities.invokeLater играть хорошо с Event диспетчерские Thread

import java.awt.*; 
import javax.swing.*; 

public class PixelArtistGUI extends JFrame { 
    public PixelArtistGUI() { 
     setTitle("PixelArtist"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 

     JPanel contentPane = new JPanel(new GridBagLayout()); 
     setContentPane(contentPane); // <<<<< 
     contentPane.setPreferredSize(new Dimension(500, 500)); // <<<<< 
     GridBagConstraints c = new GridBagConstraints(); 

     JButton b; 

     for (int j = 0; j < 10; j++) { 
      for (int i = 0; i < 10; i++) { 
       b = new JButton(); 
       c.gridx = i; 
       c.gridy = j; 
       contentPane.add(b,c); 
      } 
     } 
     pack(); // <<< 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { // <<< 
      @Override 
      public void run() { 
       try { 
        new PixelArtistGUI().setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
2

Вы должны по крайней мере использовать

public void add(Component comp,Object constraints) 

т.е:

contentPane.add(b,c); 

И как FredK говорит добавить ContentPane к раме

+0

Пример был обновлен с вашими предложениями - к сожалению, я все равно получаю тот же пустой JFrame. Спасибо! –