Java Tutorial/Swing/BoxLayout

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

Align your components in horizontal or vertical layout

   <source lang="java">

import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class Main extends JFrame {

 public Main() {
   super("Demostrating BoxLayout");
   final int SIZE = 3;
   Container c = getContentPane();
   c.setLayout(new BorderLayout(30, 30));
   Box boxes[] = new Box[4];
   boxes[0] = Box.createHorizontalBox();
   boxes[1] = Box.createVerticalBox();
   boxes[2] = Box.createHorizontalBox();
   boxes[3] = Box.createVerticalBox();
   for (int i = 0; i < SIZE; i++)
     boxes[0].add(new JButton("boxes[0]: " + i));
   for (int i = 0; i < SIZE; i++) {
     boxes[1].add(Box.createVerticalStrut(25));
     boxes[1].add(new JButton("boxes[1]: " + i));
   }
   for (int i = 0; i < SIZE; i++) {
     boxes[2].add(Box.createHorizontalGlue());
     boxes[2].add(new JButton("boxes[2]: " + i));
   }
   for (int i = 0; i < SIZE; i++) {
     boxes[3].add(Box.createRigidArea(new Dimension(12, 8)));
     boxes[3].add(new JButton("boxes[3]: " + i));
   }
   JPanel panel = new JPanel();
   panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
   for (int i = 0; i < SIZE; i++) {
     panel.add(Box.createGlue());
     panel.add(new JButton("panel: " + i));
   }
   c.add(boxes[0], BorderLayout.NORTH);
   c.add(boxes[1], BorderLayout.EAST);
   c.add(boxes[2], BorderLayout.SOUTH);
   c.add(boxes[3], BorderLayout.WEST);
   c.add(panel, BorderLayout.CENTER);
   setSize(350, 300);
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setVisible(true);
   
 }
 public static void main(String args[]) {
   Main app = new Main();
 }

}</source>





A Simple BoxLayout Test

   <source lang="java">

import java.awt.Container; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; public class BoxLayoutYAXISTest {

 public static void main(String[] args) {
   JFrame f = new JFrame("Vertical BoxLayout-managed container");
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   Container pane = f.getContentPane();
   pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
   for (float align = 0.0f; align <= 1.0f; align += 0.25f) {
     JButton button = new JButton("X Alignment = " + align);
     button.setAlignmentX(align);
     pane.add(button);
   }
   f.setSize(400, 300);
   f.setVisible(true);
 }

}</source>





A vertical box container arranges the components top-to-bottom aligned in their preferred sizes.

   <source lang="java">

import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; public class Main {

 public static void main(String[] argv) throws Exception {
   JButton component1 = new JButton();
   JButton component2 = new JButton();
   // Create vertical box container
   Box box = new Box(BoxLayout.Y_AXIS);
   // create a vertical box container
   box = Box.createVerticalBox();
   // Add components
   box.add(component1);
   box.add(component2);
 }

}</source>





BoxLayout: set a rigid area among our components.

   <source lang="java">

import java.awt.Dimension; import java.awt.Insets; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class RigidArea {

 public static void main(String[] args) {
   JPanel panel = new JPanel();
   panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
   panel.setBorder(new EmptyBorder(new Insets(40, 60, 40, 60)));
   panel.add(new JButton("Button"));
   panel.add(Box.createRigidArea(new Dimension(0, 5)));
   panel.add(new JButton("Button"));
   panel.add(Box.createRigidArea(new Dimension(0, 5)));
   panel.add(new JButton("Button"));
   panel.add(Box.createRigidArea(new Dimension(0, 5)));
   panel.add(new JButton("Button"));
   JFrame f = new JFrame();
   f.add(panel);
   f.pack();
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   f.setLocationRelativeTo(null);
   f.setVisible(true);
 }

}</source>





Creating a BoxLayout

BoxLayout has a single constructor:

public BoxLayout(Container target, int axis)



   <source lang="java">

public BoxLayout(Container target, int axis)</source>





Drawing Borders Within a BoxLayout-Managed Container

   <source lang="java">

import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.LayoutManager; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class BoxLayoutManagerContainerTest {

 public static void main(String[] args) {
   JFrame f = new JFrame("Vertical BoxLayout-managed container");
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   Container pane = new BoxPanel();
   f.setContentPane(pane);
   pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
   for (float align = 0.0f; align <= 1.0f; align += 0.25f) {
     JTextField tf = new JTextField("X Alignment = " + align, 10);
     tf.setAlignmentX(align);
     pane.add(tf);
   }
   f.setSize(400, 300);
   f.setVisible(true);
 }

} class BoxPanel extends JPanel {

 public void paintChildren(Graphics g) {
   super.paintChildren(g);
   Dimension size = getSize();
   LayoutManager manager = getLayout();
   if ((manager != null) && (manager instanceof BoxLayout)) {
     BoxLayout layout = (BoxLayout) manager;
     boolean vertical = true;
     if (vertical) {
       int axis = (int) (layout.getLayoutAlignmentX(this) * size.width);
       g.fillRect(axis - 1, 0, 3, size.height);
     } else {
       int axis = (int) (layout.getLayoutAlignmentY(this) * size.height);
       g.fillRect(0, axis - 1, size.width, 3);
     }
   }
 }

}</source>





Glue spreads the components as far apart as possible.

   <source lang="java">

import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; public class Main {

 public static void main(String[] argv) throws Exception {
   JButton component1 = new JButton();
   JButton component2 = new JButton();
   Box box = new Box(BoxLayout.X_AXIS);
   
   box.add(component1);
   box.add(Box.createGlue());
   box.add(component2);
 }

}</source>





Laying Out Components in a Row or Column

   <source lang="java">

import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; public class Main {

 public static void main(String[] argv) throws Exception {
   JButton component1 = new JButton();
   JButton component2 = new JButton();
   Box box = new Box(BoxLayout.X_AXIS);
   box = Box.createHorizontalBox();
   // Add components
   box.add(component1);
   box.add(component2);
 }

}</source>





Separating Components in a Row or Column

   <source lang="java">

import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; public class Main {

 public static void main(String[] argv) throws Exception {
   JButton component1 = new JButton();
   JButton component2 = new JButton();
   Box box = new Box(BoxLayout.X_AXIS);
   
   box.add(component1);
   box.add(Box.createGlue());
   box.add(component2);
 }

}</source>





Struts and Glue

   <source lang="java">

import java.awt.BorderLayout; import java.awt.Container; import javax.swing.Box; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JRadioButton; public class TryBoxLayout {

 public static void main(String[] args) {
   JFrame aWindow = new JFrame("This is a Box Layout");
   aWindow.setBounds(30, 30, 300, 300);
   aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   // Create left column of radio buttons
   Box left = Box.createVerticalBox();
   left.add(Box.createVerticalStrut(30));
   ButtonGroup radioGroup = new ButtonGroup();
   JRadioButton rbutton;
   radioGroup.add(rbutton = new JRadioButton("Red"));
   left.add(rbutton);
   left.add(Box.createVerticalStrut(30));
   radioGroup.add(rbutton = new JRadioButton("Green"));
   left.add(rbutton);
   left.add(Box.createVerticalStrut(30));
   radioGroup.add(rbutton = new JRadioButton("Blue"));
   left.add(rbutton);
   left.add(Box.createVerticalStrut(30));
   radioGroup.add(rbutton = new JRadioButton("Yellow"));
   left.add(rbutton);
   Box right = Box.createVerticalBox();
   right.add(new JCheckBox("A"));
   right.add(new JCheckBox("B"));
   right.add(new JCheckBox("C"));
   Box top = Box.createHorizontalBox();
   top.add(left);
   top.add(right);
   Container content = aWindow.getContentPane();
   content.setLayout(new BorderLayout());
   content.add(top, BorderLayout.CENTER);
   aWindow.pack();
   aWindow.setVisible(true);
 }

}</source>





Strut spreads the components apart by a fixed distance

   <source lang="java">

import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; public class Main {

 public static void main(String[] argv) throws Exception {
   JButton component1 = new JButton();
   Box box = new Box(BoxLayout.X_AXIS);
   int width = 10;
   box.add(Box.createHorizontalStrut(width));
   box.add(component1);
 }

}</source>





Using a BoxLayout Manager

Arranges components either in a row or in a column.

  1. Box class offers a container that uses BoxLayout as its default layout manager.
  2. BoxLayout works to honor each component"s x and y alignment properties as well as its maximum size.

The BoxLayout class has only one constructor:



   <source lang="java">

public BoxLayout(java.awt.Container target, int axis)</source>





Vertical BoxLayout-managed container

   <source lang="java">

import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.LayoutManager; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class VerticalBoxLayoutManagerContainerTest {

 public static void main(String[] args) {
   JFrame f = new JFrame();
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   Container pane = new BoxPanel();
   f.setContentPane(pane);
   BoxLayout bl = new BoxLayout(pane, BoxLayout.Y_AXIS);
   pane.setLayout(bl);
   for (float align = 0.0f; align <= 1.0f; align += 0.25f) {
     JButton button = new JButton("X Alignment = " + align);
     button.setAlignmentX(align);
     pane.add(button);
     pane.add(Box.createRigidArea(new Dimension(0, 15)));
   }
   f.setSize(400, 300);
   f.setVisible(true);
 }

} class BoxPanel extends JPanel {

 public void paintChildren(Graphics g) {
   super.paintChildren(g);
   Dimension size = getSize();
   LayoutManager manager = getLayout();
   if ((manager != null) && (manager instanceof BoxLayout)) {
     BoxLayout layout = (BoxLayout) manager;
     boolean vertical = true;
     if (vertical) {
       int axis = (int) (layout.getLayoutAlignmentX(this) * size.width);
       g.fillRect(axis - 1, 0, 3, size.height);
     } else {
       int axis = (int) (layout.getLayoutAlignmentY(this) * size.height);
       g.fillRect(0, axis - 1, size.width, 3);
     }
   }
 }

}</source>





X-Axis Alignment

   <source lang="java">

import java.awt.ruponent; import java.awt.Container; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class XAxisAlignY {

 private static Container layoutComponents(String title, float alignment) {
   String labels[] = { "-", "-", "-" };
   JPanel container = new JPanel();
   container.setBorder(BorderFactory.createTitledBorder(title));
   BoxLayout layout = new BoxLayout(container, BoxLayout.X_AXIS);
   container.setLayout(layout);
   for (int i = 0, n = labels.length; i < n; i++) {
     JButton button = new JButton(labels[i]);
     button.setAlignmentY(alignment);
     container.add(button);
   }
   return container;
 }
 public static void main(String args[]) {
   JFrame frame = new JFrame("Alignment Example");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   Container panel1 = layoutComponents("Top", Component.TOP_ALIGNMENT);
   Container panel2 = layoutComponents("Center", Component.CENTER_ALIGNMENT);
   Container panel3 = layoutComponents("Bottom", Component.BOTTOM_ALIGNMENT);
   frame.setLayout(new GridLayout(1, 3));
   frame.add(panel1);
   frame.add(panel2);
   frame.add(panel3);
   frame.setSize(400, 150);
   frame.setVisible(true);
 }

}</source>





Y-Axis Alignment

   <source lang="java">

import java.awt.ruponent; import java.awt.Container; import java.awt.FlowLayout; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class YAxisAlignX {

 private static Container layoutComponents(String title, float alignment) {
   String labels[] = { "--", "----", "--------", "------------" };
   JPanel container = new JPanel();
   container.setBorder(BorderFactory.createTitledBorder(title));
   BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
   container.setLayout(layout);
   for (int i = 0, n = labels.length; i < n; i++) {
     JButton button = new JButton(labels[i]);
     button.setAlignmentX(alignment);
     container.add(button);
   }
   return container;
 }
 public static void main(String args[]) {
   JFrame frame = new JFrame("Alignment Example");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   Container panel1 = layoutComponents("Left", Component.LEFT_ALIGNMENT);
   Container panel2 = layoutComponents("Center", Component.CENTER_ALIGNMENT);
   Container panel3 = layoutComponents("Right", Component.RIGHT_ALIGNMENT);
   frame.setLayout(new FlowLayout());
   frame.add(panel1);
   frame.add(panel2);
   frame.add(panel3);
   frame.pack();
   frame.setVisible(true);
 }

}</source>