1

我想要一个 3x3 的网格布局,结构如下:

 _ _ _ _ _ _ _ _ _ _ _ _
|        Label         |
| Button Button Button |
|       TextArea       |
|_ _ _ _ _ _ _ _ _ _ _ |

但是布局被破坏了。

    public static void main(String[] args){
    JFrame frame = new JFrame("title");
    frame.setSize(400,500);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    GridLayout layout = new GridLayout(3,3);

    JPanel pan0 = new JPanel();
    JPanel pan1 = new JPanel();
    JPanel pan2 = new JPanel();

    pan0.setLayout(layout);
    GridBagConstraints c = new GridBagConstraints();

    JLabel title = new JLabel("title");
    title.setFont(new Font("Serif", Font.BOLD, 40));
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 3;
    pan0.add(title, c);

    JButton b1 = new JButton("button1");
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    pan0.add(b1, c);

    JButton b2 = new JButton("button2");
    c.gridx = 1;
    c.gridy = 2;
    c.gridwidth = 1;
    pan0.add(b2, c);

    JButton b3 = new JButton("button3");
    c.gridx = 2;
    c.gridy = 3;
    c.gridwidth = 1;
    pan0.add(b3, c);    

    TextArea text1 = new TextArea(15,40);
    c.gridx = 2;
    c.gridy = 0;
    c.gridwidth = 3;
    pan0.add(text1, c);

    frame.add(pan0);
    frame.pack();

  }
}
4

3 回答 3

6

您正在使用 aGridBagConstraint和 aGridLayout

而是使用GridBagLayout它在同一个包中

于 2011-05-15T19:46:12.880 回答
3

要添加到棘轮的答案,您还有一些网格位置不正确。试试这个

    GridBagLayout layout = new GridBagLayout();

    JPanel pan0 = new JPanel();
    JPanel pan1 = new JPanel();
    JPanel pan2 = new JPanel();

    pan0.setLayout(layout);
    GridBagConstraints c = new GridBagConstraints();

    JLabel title = new JLabel("title");
    title.setFont(new Font("Serif", Font.BOLD, 40));
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 3;
    c.fill = GridBagConstraints.CENTER;
    pan0.add(title, c);

    JButton b1 = new JButton("button1");
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    pan0.add(b1, c);

    JButton b2 = new JButton("button2");
    c.gridx = 1;
    c.gridy = 1;
    c.gridwidth = 1;
    pan0.add(b2, c);

    JButton b3 = new JButton("button3");
    c.gridx = 2;
    c.gridy = 1;
    c.gridwidth = 1;
    pan0.add(b3, c);    

    TextArea text1 = new TextArea(15,40);
    c.gridx = 0;
    c.gridy = 2;
    c.gridwidth = 3;
    c.fill = GridBagConstraints.CENTER;
    pan0.add(text1, c);
于 2011-05-15T19:50:16.153 回答
2

您将 GridLayout 与 GridBagLayout 混淆了,但我自己会使用 BoxLayout 进行垂直定位,然后可能会使用 GridLayout 来进行按钮。例如,

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

public class Foo003 {
   private static final int BTN_COUNT = 3;
   private static final int VERT_GAP = 10;
   private static final int EB_GAP = 5;
   private static final float TITLE_SIZE = 36f;
   private static final String TITLE_TEXT = "This is my Title";

   private static void createAndShowUI() {

      JLabel titleLabel = new JLabel(TITLE_TEXT, SwingConstants.CENTER);
      titleLabel.setFont(titleLabel.getFont().deriveFont(TITLE_SIZE));
      JPanel titlePanel = new JPanel();
      titlePanel.add(titleLabel);

      JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
      for (int i = 0; i < BTN_COUNT; i++) {
         JButton btn = new JButton("Button " + (i + 1));
         buttonPanel.add(btn);
      }

      JTextArea textArea = new JTextArea(20, 30);

      JPanel mainPanel = new JPanel();
      mainPanel.setBorder(BorderFactory.createEmptyBorder(EB_GAP, EB_GAP, EB_GAP, EB_GAP));
      mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
      mainPanel.add(titlePanel);
      mainPanel.add(Box.createVerticalStrut(VERT_GAP));
      mainPanel.add(buttonPanel);
      mainPanel.add(Box.createVerticalStrut(VERT_GAP));
      mainPanel.add(new JScrollPane(textArea));

      JFrame frame = new JFrame("Foo003");
      frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
于 2011-05-15T19:54:26.697 回答