Java Tutorial/Swing/GridBagConstraints

Материал из Java эксперт
Перейти к: навигация, поиск

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

  1. GridBagConstraints specifies how to display a specific component.
  2. Every component added to a GridBagLayout container should have a GridBagConstraints object associated with it.
  3. 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>