Java Tutorial/Swing/GridBagConstraints
Содержание
- 1 Adding Components with a Relative X Position
- 2 Adding Components with a Relative Y Position
- 3 Adding Components with Relative X and Y Coordinates
- 4 A GridBagLayout Example: weightx, weighty
- 5 A Simple Application That Uses GridBagConstraints.WEST
- 6 Effects of the fill Constraint
- 7 Effects of the gridheight Constraint
- 8 Effects of the gridwidth Constraint
- 9 Filling the Entire Column
- 10 Use GridBagLayout to layout RadioButtons
- 11 Using GridBagConstraints
- 12 Using the REMAINDER Value for a Width
Adding Components with a Relative X Position
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class RelativeX {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = f.getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridy = 0;
pane.add(new JButton("First row"), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
gbc.gridy = 1;
pane.add(new JButton("Second row, first column"), gbc);
pane.add(new JButton("Second row, second column"), gbc);
pane.add(new JButton("Second row, third column"), gbc);
gbc.gridy = 2;
pane.add(new JButton("Third row"), gbc);
f.setSize(600, 300);
f.setVisible(true);
}
}
Adding Components with a Relative Y Position
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class RelativeY {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = f.getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
pane.add(new JButton("First column"), gbc);
gbc.gridx = 1;
gbc.gridy = GridBagConstraints.RELATIVE;
pane.add(new JButton("Second column, first row"), gbc);
pane.add(new JButton("Second column, second row"), gbc);
pane.add(new JButton("Second column, third row"), gbc);
gbc.gridx = 2;
pane.add(new JButton("Third column"), gbc);
f.setSize(500, 300);
f.setVisible(true);
}
}
Adding Components with Relative X and Y Coordinates
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class RelativeXY {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = f.getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = GridBagConstraints.RELATIVE;
pane.add(new JButton("First row, first column"), gbc);
pane.add(new JButton("Second row"), gbc);
pane.add(new JButton("Third row"), gbc);
gbc.gridx = GridBagConstraints.RELATIVE;
pane.add(new JButton("First row, second column"), gbc);
f.setSize(500, 300);
f.setVisible(true);
}
}
A GridBagLayout Example: weightx, weighty
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JPanel;
public class Main extends JPanel {
protected void makebutton(String name, GridBagLayout gridbag, GridBagConstraints c) {
Button button = new Button(name);
gridbag.setConstraints(button, c);
add(button);
}
public Main() {
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
setLayout(gridbag);
c.weightx = 1.0;
c.weighty = 1.0;
makebutton("Button 1", gridbag, c);
c.fill = GridBagConstraints.BOTH;
makebutton("Button 2", gridbag, c);
}
public static void main(String args[]) {
Frame f = new Frame();
JPanel mgb = new Main();
f.add("Center", mgb);
f.pack();
f.setSize(300, 300);
f.setVisible(true);
}
}
A Simple Application That Uses GridBagConstraints.WEST
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class GridBagConstraintsSimplePanel extends JPanel {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new GridBagConstraintsSimplePanel());
f.setSize(400, 300);
f.setVisible(true);
}
public GridBagConstraintsSimplePanel() {
super();
GridBagConstraints constraints = new GridBagConstraints();
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
constraints.anchor = GridBagConstraints.WEST;
constraints.gridy = 0;
JLabel label = new JLabel("First name:");
add(label, constraints);
JTextField tf = new JTextField(8);
add(tf, constraints);
label = new JLabel("Last name:");
add(label, constraints);
tf = new JTextField(8);
add(tf, constraints);
constraints.gridy = 1;
label = new JLabel("Address:");
add(label, constraints);
tf = new JTextField(10);
add(tf, constraints);
}
}
Effects of the fill Constraint
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridBagLayoutFill {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = f.getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = GridBagConstraints.RELATIVE;
pane.add(new JButton("This button"s preferred width " + "is large because its text is long"),
gbc);
pane.add(new JButton("Small centered button"), gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
pane.add(new JButton("Expands to fill column width"), gbc);
f.setSize(400, 300);
f.setVisible(true);
}
}
Effects of the gridheight Constraint
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JFrame;
public class GridBagLayoutGridHeight {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = f.getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
pane.add(new JLabel("First row, first column"), gbc);
pane.add(new JLabel("First row, second column"), gbc);
gbc.gridheight = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.VERTICAL;
pane.add(new JLabel("First row, third column"), gbc);
gbc.gridx = 0;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.NONE;
pane.add(new JButton("Second row"), gbc);
pane.add(new JButton("Third row"), gbc);
f.setSize(600, 300);
f.setVisible(true);
}
}
Effects of the gridwidth Constraint
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridBagLayoutColumnSpan {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = f.getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = GridBagConstraints.RELATIVE;
pane.add(new JButton("First row, first column"), gbc);
pane.add(new JButton("Second row"), gbc);
gbc.gridwidth = 2;
pane.add(new JButton("Third row, spans two columns"), gbc);
gbc.gridwidth = 1;
gbc.gridx = GridBagConstraints.RELATIVE;
pane.add(new JButton("First row, second column"), gbc);
f.setSize(400, 300);
f.setVisible(true);
}
}
Filling the Entire Column
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridBagLayoutColumnSpanHORIZONTAL {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = f.getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = GridBagConstraints.RELATIVE;
pane.add(new JButton("First row, first column"), gbc);
pane.add(new JButton("Second row"), gbc);
gbc.gridwidth = 2;
gbc.fill = GridBagConstraints.HORIZONTAL;
pane.add(new JButton("Third row, spans two columns"), gbc);
gbc.gridwidth = 1;
gbc.fill = GridBagConstraints.NONE;
gbc.gridx = GridBagConstraints.RELATIVE;
pane.add(new JButton("First row, second column"), gbc);
f.setSize(400, 300);
f.setVisible(true);
}
}
Use GridBagLayout to layout RadioButtons
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
public class PizzaGridBagLayout extends JFrame {
public static void main(String[] args) {
new PizzaGridBagLayout();
}
JTextField name = new JTextField(20), phone = new JTextField(10), address = new JTextField(20);
JRadioButton small = new JRadioButton("Small"), medium = new JRadioButton("Medium"),
large = new JRadioButton("Large"), thick = new JRadioButton("Thick"),
thin = new JRadioButton("Thin");
JCheckBox pepperoni = new JCheckBox("Pepperoni"), mushrooms = new JCheckBox("Mushrooms"),
anchovies = new JCheckBox("Anchovies");
JButton okButton = new JButton("OK"), closeButton = new JButton("Close");
public PizzaGridBagLayout() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel1 = new JPanel();
panel1.setLayout(new GridBagLayout());
addItem(panel1, new JLabel("Name:"), 0, 0, 1, 1, GridBagConstraints.EAST);
addItem(panel1, new JLabel("Phone:"), 0, 1, 1, 1, GridBagConstraints.EAST);
addItem(panel1, new JLabel("Address:"), 0, 2, 1, 1, GridBagConstraints.EAST);
addItem(panel1, name, 1, 0, 2, 1, GridBagConstraints.WEST);
addItem(panel1, phone, 1, 1, 1, 1, GridBagConstraints.WEST);
addItem(panel1, address, 1, 2, 2, 1, GridBagConstraints.WEST);
Box sizeBox = Box.createVerticalBox();
ButtonGroup sizeGroup = new ButtonGroup();
sizeGroup.add(small);
sizeGroup.add(medium);
sizeGroup.add(large);
sizeBox.add(small);
sizeBox.add(medium);
sizeBox.add(large);
sizeBox.setBorder(BorderFactory.createTitledBorder("Size"));
addItem(panel1, sizeBox, 0, 3, 1, 1, GridBagConstraints.NORTH);
Box styleBox = Box.createVerticalBox();
ButtonGroup styleGroup = new ButtonGroup();
styleGroup.add(thin);
styleGroup.add(thick);
styleBox.add(thin);
styleBox.add(thick);
styleBox.setBorder(BorderFactory.
createTitledBorder("Style"));
addItem(panel1, styleBox, 1, 3, 1, 1, GridBagConstraints.NORTH);
Box topBox = Box.createVerticalBox();
ButtonGroup topGroup = new ButtonGroup();
topGroup.add(pepperoni);
topGroup.add(mushrooms);
topGroup.add(anchovies);
topBox.add(pepperoni);
topBox.add(mushrooms);
topBox.add(anchovies);
topBox.setBorder(BorderFactory.createTitledBorder("Toppings"));
addItem(panel1, topBox, 2, 3, 1, 1, GridBagConstraints.NORTH);
Box buttonBox = Box.createHorizontalBox();
buttonBox.add(okButton);
buttonBox.add(Box.createHorizontalStrut(20));
buttonBox.add(closeButton);
addItem(panel1, buttonBox, 2, 4, 1, 1, GridBagConstraints.NORTH);
this.add(panel1);
this.pack();
this.setVisible(true);
}
private void addItem(JPanel p, JComponent c, int x, int y, int width, int height, int align) {
GridBagConstraints gc = new GridBagConstraints();
gc.gridx = x;
gc.gridy = y;
gc.gridwidth = width;
gc.gridheight = height;
gc.weightx = 100.0;
gc.weighty = 100.0;
gc.insets = new Insets(5, 5, 5, 5);
gc.anchor = align;
gc.fill = GridBagConstraints.NONE;
p.add(c, gc);
}
}
Using GridBagConstraints
- GridBagConstraints specifies how to display a specific component.
- Every component added to a GridBagLayout container should have a GridBagConstraints object associated with it.
- Without GridBagConstraints, the GridBagLayout is a blank slate.
import java.awt.ruponent;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridBagButtons {
private static final Insets insets = new Insets(0, 0, 0, 0);
public static void main(final String args[]) {
final JFrame frame = new JFrame("GridBagLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
JButton button;
// Row One - Three Buttons
button = new JButton("One");
addComponent(frame, button, 0, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
button = new JButton("Two");
addComponent(frame, button, 1, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
button = new JButton("Three");
addComponent(frame, button, 2, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
// Row Two - Two Buttons
button = new JButton("Four");
addComponent(frame, button, 0, 1, 2, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
button = new JButton("Five");
addComponent(frame, button, 2, 1, 1, 2, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
// Row Three - Two Buttons
button = new JButton("Six");
addComponent(frame, button, 0, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
button = new JButton("Seven");
addComponent(frame, button, 1, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);
frame.setSize(500, 200);
frame.setVisible(true);
}
private static void addComponent(Container container, Component component, int gridx, int gridy,
int gridwidth, int gridheight, int anchor, int fill) {
GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 1.0, 1.0,
anchor, fill, insets, 0, 0);
container.add(component, gbc);
}
}
Using the REMAINDER Value for a Width
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridBagLayoutRemainder {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane = f.getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
pane.add(new JButton("First row, first column"), gbc);
pane.add(new JButton("First row, second column"), gbc);
pane.add(new JButton("First row, third column"), gbc);
gbc.gridx = 0;
pane.add(new JButton("Second row"), gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.fill = GridBagConstraints.HORIZONTAL;
pane.add(new JButton("Third row, gridwidth set to REMAINDER"), gbc);
f.setSize(600, 300);
f.setVisible(true);
}
}