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
<source lang="java">
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); }
}</source>
Adding Components with a Relative Y Position
<source lang="java">
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); }
}</source>
Adding Components with Relative X and Y Coordinates
<source lang="java">
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); }
}</source>
A GridBagLayout Example: weightx, weighty
<source lang="java">
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); }
}</source>
A Simple Application That Uses GridBagConstraints.WEST
<source lang="java">
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); }
}</source>
Effects of the fill Constraint
<source lang="java">
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); }
}</source>
Effects of the gridheight Constraint
<source lang="java">
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); }
}</source>
Effects of the gridwidth Constraint
<source lang="java">
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); }
}</source>
Filling the Entire Column
<source lang="java">
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); }
}</source>
Use GridBagLayout to layout RadioButtons
<source lang="java">
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); }
}</source>
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.
<source lang="java">
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); }
}</source>
Using the REMAINDER Value for a Width
<source lang="java">
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); }
}</source>