2013-11-13 5 views
0

здесь я пытаюсь привязать компоненты (кнопки) к боковой панели, но я, очевидно, что-то пропускаю с помощью GridBagConstraints. Я хотел бы, чтобы они имели посылку, если это было возможно; любая идея, как я буду делать что-то вроде этого enter image description here? Могу ли я просто использовать вставки для заполнения? Приветствия за любую помощь.GridBagLayout не использует привязку

import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.io.IOException; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JLabel; 

@SuppressWarnings("serial") 
public class PlayGamePanel extends JComponent{ 

    @SuppressWarnings("unused") 
    JComponent GamePanel2() throws IOException { 

     JComponent GamePanel = new JLabel(); 

     //Setting up the gridbaglayout 
     GamePanel.setLayout(new GridBagLayout()); 
     GridBagConstraints gbLayout = new GridBagConstraints(); 

     /*//Creating a button to test out switching panels 
     * 
     JButton testButton = new JButton ("test"); 
     GamePanel.add(testButton);*/ 

     //Creating buttons for answering the quiz 

     gbLayout.gridx = 0; 
     gbLayout.gridy = 0; 
     gbLayout.weightx = 1.0; 
     gbLayout.anchor = GridBagConstraints.NORTHWEST; 
     gbLayout.insets = new Insets(20, 20, 20, 20); 

     JButton AnswerOneButton = new JButton("Answer One"); 
     GamePanel.add(AnswerOneButton); 
     GamePanel.add(AnswerOneButton, gbLayout); 

     gbLayout.gridx = 0; 
     gbLayout.gridy = 0; 
     gbLayout.weightx = 1.0; 
     gbLayout.anchor = GridBagConstraints.NORTHEAST; 
     gbLayout.insets = new Insets(20, 20, 20, 20); 

     JButton AnswerTwoButton = new JButton("Answer Two"); 
     GamePanel.add(AnswerTwoButton); 
     GamePanel.add(AnswerTwoButton, gbLayout); 

     gbLayout.gridx = 0; 
     gbLayout.gridy = 0; 
     gbLayout.weightx = 1.0; 
     gbLayout.anchor = GridBagConstraints.SOUTHEAST; 
     gbLayout.insets = new Insets(20, 20, 20, 20); 

     JButton AnswerThreeButton = new JButton("Answer Three"); 
     GamePanel.add(AnswerThreeButton); 
     GamePanel.add(AnswerThreeButton, gbLayout); 


     gbLayout.gridx = 0; 
     gbLayout.gridy = 0; 
     gbLayout.weightx = 1.0; 
     gbLayout.anchor = GridBagConstraints.SOUTHWEST; 
     gbLayout.insets = new Insets(20, 20, 20, 20); 


     JButton AnswerFourButton = new JButton("Answer Four"); 
     GamePanel.add(AnswerFourButton); 
     GamePanel.add(AnswerFourButton, gbLayout); 

     return GamePanel; 
    } 
} 

ответ

3

Вам нужно пройти GridBagConstraints к контейнеру при добавлении компонентов ...

Например ...

GamePanel.add(AnswerOneButton, gbLayout); 

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

gbLayout.gridx = 0; 
gbLayout.gridy = 0; 
JButton AnswerOneButton = new JButton("Answer One"); 
GamePanel.add(AnswerOneButton, gbLayout); 

Поместить AnswerOneButton в первом столбце первой строки.

Вы можете поставить отступы для каждой ячейки, используя insets свойства, например ...

gbLayout.weightx = 1.0; 
gbLayout.gridx = 0; 
gbLayout.gridy = 0; 
gbLayout.insets = new Insets(20, 20, 20, 20); 
JButton AnswerOneButton = new JButton("Answer One"); 
GamePanel.add(AnswerOneButton, gbLayout); 

Теперь, лично я хотел бы использовать NORTHEAST, NORTHWEST, SOUTHEAST и SOUTHWEST в качестве якоря, он просто делает более чувство ко мне ...

gbLayout.weightx = 1.0; 
gbLayout.gridx = 0; 
gbLayout.gridy = 0; 
gbLayout.insets = new Insets(20, 20, 20, 20); 
gbLayout.anchor = GridBagConstraints.NORTHWEST; 
JButton AnswerOneButton = new JButton("Answer One"); 
GamePanel.add(AnswerOneButton, gbLayout); 

После обновления всех ограничений для всех кнопок я получаю что-то вроде ...

enter image description here

Вы можете взглянуть на How to Use GridBagLayout для получения более подробной информации ...

Вам также может понравиться иметь чтения через Code Conventions for the Java Programming Language, он будет делать это проще для людей, чтобы читать ваш код;)

Это также довольно интересный выбор, чтобы использовать JLabel в качестве основного контейнера, вы можете найти JPanel обеспечивает лучшую поддержку

Изменено с пример кода

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestLayout { 

    public static void main(String[] args) { 
     new TestLayout(); 
    } 

    public TestLayout() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(GamePanel2()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    @SuppressWarnings("unused") 
    JComponent GamePanel2() { 

     JComponent GamePanel = new JPanel(); 
     GamePanel.setOpaque(false); 

     //Setting up the gridbaglayout 
     GamePanel.setLayout(new GridBagLayout()); 
     GridBagConstraints gbLayout = new GridBagConstraints(); 

     /*//Creating a button to test out switching panels 
     * 
     JButton testButton = new JButton ("test"); 
     GamePanel.add(testButton);*/ 
     //Creating buttons for answering the quiz 
     gbLayout.gridx = 0; 
     gbLayout.gridy = 0; 
     gbLayout.weightx = 1.0; 
     gbLayout.anchor = GridBagConstraints.NORTHWEST; 
     gbLayout.insets = new Insets(20, 20, 20, 20); 
     JButton AnswerOneButton = new JButton("Answer One"); 
     GamePanel.add(AnswerOneButton, gbLayout); 

     gbLayout.gridx = 1; 
     gbLayout.anchor = GridBagConstraints.NORTHEAST; 
     JButton AnswerTwoButton = new JButton("Answer Two"); 
     GamePanel.add(AnswerTwoButton, gbLayout); 

     gbLayout.gridx = 0; 
     gbLayout.gridy = 1; 
     gbLayout.anchor = GridBagConstraints.SOUTHWEST; 
     JButton AnswerThreeButton = new JButton("Answer Three"); 
     GamePanel.add(AnswerThreeButton, gbLayout); 

     gbLayout.gridx = 1; 
     gbLayout.gridy = 1; 
     gbLayout.weightx = 1.0; 
     gbLayout.anchor = GridBagConstraints.SOUTHEAST; 
     JButton AnswerFourButton = new JButton("Answer Four"); 
     GamePanel.add(AnswerFourButton); 
     GamePanel.add(AnswerFourButton, gbLayout); 

     return GamePanel; 
    } 

} 
+0

Отлично, спасибо за ссылку, дайте это прочитать. Что касается кода, я думаю, что он должен работать хорошо, но он отправляет его в крайнее левое положение, а не вверху слева от контейнера. Просто попробовал использовать NORTHEAST, но не повезло. EDIT: не видел вашего редактирования, попробует все это сейчас, спасибо! – Icy100

+0

Эй, спасибо за вашу помощь, но я до сих пор не могу заставить ее работать - я редактировал мой код до сих пор в своем оригинальном посте; У меня есть чувство, что это связано с моими весовыми значениями. Есть ли вероятность увидеть ваш код для сравнения? – Icy100

+1

Вам нужно изменить значения 'gridx' и' gridy' в соответствии с ячейками, которые вы хотите, чтобы кнопки отображались, используя '0' означает, что все они находятся в одной ячейке ... – MadProgrammer

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