Java Tutorial/Swing/BoxLayout
Содержание
- 1 Align your components in horizontal or vertical layout
- 2 A Simple BoxLayout Test
- 3 A vertical box container arranges the components top-to-bottom aligned in their preferred sizes.
- 4 BoxLayout: set a rigid area among our components.
- 5 Creating a BoxLayout
- 6 Drawing Borders Within a BoxLayout-Managed Container
- 7 Glue spreads the components as far apart as possible.
- 8 Laying Out Components in a Row or Column
- 9 Separating Components in a Row or Column
- 10 Struts and Glue
- 11 Strut spreads the components apart by a fixed distance
- 12 Using a BoxLayout Manager
- 13 Vertical BoxLayout-managed container
- 14 X-Axis Alignment
- 15 Y-Axis Alignment
Align your components in horizontal or vertical layout
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();
}
}
A Simple BoxLayout Test
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);
}
}
A vertical box container arranges the components top-to-bottom aligned in their preferred sizes.
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);
}
}
BoxLayout: set a rigid area among our components.
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);
}
}
Creating a BoxLayout
BoxLayout has a single constructor:
public BoxLayout(Container target, int axis)
public BoxLayout(Container target, int axis)
Drawing Borders Within a BoxLayout-Managed Container
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);
}
}
}
}
Glue spreads the components as far apart as possible.
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);
}
}
Laying Out Components in a Row or Column
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);
}
}
Separating Components in a Row or Column
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);
}
}
Struts and Glue
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);
}
}
Strut spreads the components apart by a fixed distance
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);
}
}
Using a BoxLayout Manager
Arranges components either in a row or in a column.
- Box class offers a container that uses BoxLayout as its default layout manager.
- 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:
public BoxLayout(java.awt.Container target, int axis)
Vertical BoxLayout-managed container
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);
}
}
}
}
X-Axis Alignment
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);
}
}
Y-Axis Alignment
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);
}
}