2013-05-13 5 views
0

Я не могу перенести какие-либо из сообщений с ретрансляторами в мою простую проблему. Для того, чтобы попасть в GridBagLayout я написал простой пример:Проблемы с GridBagLayout

 JFrame frame = new JFrame(); 
    JPanel main =new JPanel(); 
    frame.setContentPane(main); 
    GridBagLayout gbl=new GridBagLayout(); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    main.setLayout(gbl); 
    JButton btn1 = new JButton("1"); 
    JButton btn2 = new JButton("2"); 

    gbc.gridx=0; 
    gbc.gridy=0; 
    gbc.gridheight=1; 
    gbc.gridwidth=1; 
    gbc.fill=GridBagConstraints.WEST; 
    gbl.setConstraints(btn1, gbc); 
    gbc.gridx=0; 
    gbc.gridy=1; 
    gbl.setConstraints(btn2, gbc); 

    frame.setSize(new Dimension(200,100)); 

    main.add(btn1); 
    main.add(btn2); 
    frame.setVisible(true); 

Здесь я есть проблема, что ни .Нанести, ни какой-либо другой параметр GBConstrains SEMS работать. Я получаю две кнопки в середине окна.

ТНХ заранее

+1

1) Пожалуйста, используйте правильное написание слов, как «ты», «твой» и «пожалуйста». Это облегчает людям понимание и помощь. 2) Чтобы получить более эффективную помощь, опубликуйте [SSCCE] (http://sscce.org/). 3) Используйте последовательный и логический отступ для кодовых блоков. Отступ кода предназначен для того, чтобы помочь людям понять поток программы. –

ответ

1

Edit: Я сделал пример приложения, которое демонстрирует, как использовать GridBadLayout, что повторное использование ограничений:

import java.awt.EventQueue; 
    import java.awt.GridBagConstraints; 
    import java.awt.GridBagLayout; 
    import java.awt.Insets; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 



    public class Test1 { 

     private JFrame frame; 

     /** 
     * Launch the application. 
     */ 
     public static void main(String[] args) { 
      EventQueue.invokeLater(new Runnable() { 
       public void run() { 
        try { 
         Test1 window = new Test1(); 
         window.frame.setVisible(true); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 

     /** 
     * Create the application. 
     */ 
     public Test1() { 
      initialize(); 
     } 

     /** 
     * Initialize the contents of the frame. 
     */ 
     private void initialize() { 
      frame = new JFrame(); 
      frame.setBounds(100, 100, 450, 300); 

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      GridBagLayout gridBagLayout = new GridBagLayout(); 
      gridBagLayout.columnWidths = new int[]{0, 0, 0}; 
      gridBagLayout.rowHeights = new int[]{0, 0}; 
      gridBagLayout.columnWeights = new double[]{0.0, 0.0, Double.MIN_VALUE}; 
      gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE}; 
      frame.getContentPane().setLayout(gridBagLayout); 

      JButton btnTest = new JButton("Test1"); 
      GridBagConstraints gbc_btnTest = new GridBagConstraints(); 
      gbc_btnTest.insets = new Insets(0, 0, 0, 5); 
      gbc_btnTest.gridx = 0; 
      gbc_btnTest.gridy = 0; 
      frame.getContentPane().add(btnTest, gbc_btnTest); 

      JButton btnTest_1 = new JButton("Test2"); 
      gbc_btnTest.gridx = 1; 
      gbc_btnTest.gridy = 0; 
      frame.getContentPane().add(btnTest_1, gbc_btnTest); 
     } 

    } 
+2

Нет необходимости иметь отдельные GridBagConstraints. Вы все равно должны правильно устанавливать отклонения, используете ли вы один или несколько противопоказаний. – camickr

+0

У меня создалось впечатление, что повторное использование GridBagConstraint приведет к тому, что обе кнопки имеют одинаковые значения для gridx и gridy. Однако не проверял. – noamik

+1

@noamik Просто уточнить, нет. Нет необходимости создавать новые экземпляры GBC, но в некоторых случаях это более осторожно. –

2

Ваша конфигурация вашего GridBagConstraint неверны:

  • fill может принимать только: NONE, VERTICAL, HORIZONTAL или BOTH.
  • anchor можно использовать относительное расположение в «клетке»
  • fill и anchor почти всегда требуют, чтобы использовать weightx/weighty
  • Старайтесь избегать использования gridx и gridy, потому что они трудно поддерживать. Вместо этого используйте их значение по умолчанию (RELATIVE), и вы можете изменить значение gridwidth/gridheight, чтобы установить его на 1 (или больше, если необходимо) и REMAINDER, чтобы сделать перенос макета на следующую строку/столбец (компоненты затем располагаются в том порядке, в котором они были добавлены в контейнер

Вот рабочий код вашей (хотя я не уверен в точном макете вы ориентируетесь):.

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestGBL { 

    protected void initUI() { 
     JFrame frame = new JFrame(); 
     GridBagLayout gbl = new GridBagLayout(); 
     JPanel main = new JPanel(gbl); 
     frame.setContentPane(main); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.anchor = GridBagConstraints.WEST; 
     gbc.weightx = 1.0; 
     main.setLayout(gbl); 
     JButton btn1 = new JButton("1"); 
     JButton btn2 = new JButton("2"); 

     gbl.setConstraints(btn1, gbc); 
     gbl.setConstraints(btn2, gbc); 

     main.add(btn1); 
     main.add(btn2); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestGBL().initUI(); 
      } 
     }); 
    } 

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