Java Problem using GridLayout
I want to have a 3x3 grid layout struc开发者_开发技巧tured like this:
_ _ _ _ _ _ _ _ _ _ _ _
| Label |
| Button Button Button |
| TextArea |
|_ _ _ _ _ _ _ _ _ _ _ |
But the layout is broken.
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();
}
}
you are using a GridBagConstraint
with a GridLayout
instead use a GridBagLayout
it's in the same pakage
To add to ratchet's answer, you also have some grid positions incorrect. Try this
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);
You're confusing GridLayout with GridBagLayout, but I'd use a BoxLayout for the vertical positioning myself, and then perhaps a GridLayout for the buttons. For e.g.,
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();
}
});
}
}
精彩评论