Назад Зміст Вперед

11.7 Диспетчери компоновки xLayout

Використання менеджера компоновки BoxLayout

Box в перекладі з англійської означає ящик. З назви вже стає зрозуміло, що являє собою цей менеджер. BoxLayout - це ящик, в який можна складати компоненти. Причому складати можна зверху-вниз або зліва-направо - це задається розробником при ініціалізації менеджера компоновки BoxLayout. Виходить, що BoxLayout розміщує компоненти в рядок або в стовпець. BoxLayout досить простий менеджер компонування, тому використовувати його треба в комбінації з іншими менеджерами компонування або з самим BoxLayout.
Подивимося, як можна використовувати BoxLayout. Створимо вікно додатку, в якому будуть розташовуватися кілька кнопок JButton в стовпець або в рядок. Подивимося, що необхідно для цього зробити, щоб отримати результат такий, як показано на малюнках.
BoxLayout буде мати у своєму розпорядженні компоненти зверху вниз, якщо не ставити додаткових налаштувань розташування.

А так будуть розташовуватися ті ж самі компоненти, якщо сказати BoxLayout розташовувати зліва направо.
На перший погляд виходить не особливо красиво, але це тільки початок. У BoxLayout є досить налаштувань для наведення краси. Подивимося тепер на вихідний код прикладів.
1
2
3
4
5
6
7
8
9
10
11
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
JButton button1 = new JButton("Top");
panel.add(button1);
JButton button2 = new JButton("Center");
panel.add(button2);
JButton button3 = new JButton("Bottom");
panel.add(button3);
Тут ми створюємо панель, встановлюємо у неї BoxLayout. При створенні BoxLayout конструктору передається два параметри. 
Перший параметр - це посилання на панель JPanel, у якій розташуванням компонентів керуватиме BoxLayout
Другий параметр - це константа BoxLayout, яка говорить менеджеру компонування, яким чином розташовувати компоненти - зліва направо або зверху вниз. Іншими словами другий параметр задає орієнтацію ящика. 
Константа 
BoxLayout.X_AXIS задає орієнтацію зліва направо, 
BoxLayout.Y_AXIS - зверху вниз. 
Крім цього є ще дві константи, які також визначають оріентауію менеджера компоновки BoxLayout. 
Це BoxLayout.LINE_AXIS і BoxLayout.PAGE_AXIS. Перша константа розташовує компоненти аналогічно рядку тексту. Для російської локалі поведінка BoxLayout.LINE_AXIS буде аналогічна поведінці BoxLayout.X_AXIS, а поведінка BoxLayout.PAGE_AXIS - BoxLayout.Y_AXIS.

https://javaswing.wordpress.com/2009/12/15/boxlayout_using_part1/#more-284

Использование менеджера компоновки BoxLayout. Выравнивание
Визначаючи розташування компонентів графічного інтерфейсу користувача за допомогою BoxLayout, буває необхідним задати вирівнювання компонентів. Вирівнювання компонентів в BoxLayout реалізовано цікавим чином. Приклад демонструє те, як змінюється розташування компонентів в BoxLayout в залежності від обраних параметрів вирівнювання.

Як приклад, BoxLayout компонує три кнопки. При натисканні на кнопку, змінюється її горизонтальне вирівнювання. Вирівнювання змінюється циклічно. Зміна вирівнювання виконується за допомогою методу setAlignmentX. Як параметр методу передається одна з констант JComponent - LEFT_ALIGNMENT, CENTER_ALIGNMENT або RIGHT_ALIGNMENT. У прикладі, як тільки користувач натискає на кнопку, вирівнювання по осі X змінюється, а конкретне значення вирівнювання можна визначити за написом. Те, яким чином вирівнювання впливає на розташування кнопок в тестовому додатку можна побачити нижче на малюнках.
Использование менеджера компоновки BoxLayout. Выравнивание компонентов
Использование менеджера компоновки BoxLayout. Выравнивание компонентов
Использование менеджера компоновки BoxLayout. Выравнивание
Щоб самим переконатися і подивитися особливості вирівнювання BoxLayout, пропоную подивитися і запустити у себе тестовий приклад, код якого наведено нижче. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestFrame extends JFrame {
     
    public static void createGUI() {
        JFrame frame = new JFrame("Test frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
         
        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Object source = e.getSource();
                if(source instanceof JButton) {
                    JButton button = (JButton) e.getSource();
                    float align = button.getAlignmentX();
                    String title = "";
                    if(align == JComponent.LEFT_ALIGNMENT) {
                        align = JComponent.CENTER_ALIGNMENT;
                        title = "CENTER_ALIGNMENT";
                    } else if (align == JComponent.CENTER_ALIGNMENT) {
                        align = JComponent.RIGHT_ALIGNMENT;
                        title = "RIGHT_ALIGNMENT";
                    } else {
                        align = JComponent.LEFT_ALIGNMENT;
                        title = "LEFT_ALIGNMENT";
                    }
                    button.setAlignmentX(align);
                    button.setText(title);
                }                                              
            }          
        };
         
        Font font = new Font("Verdana", Font.PLAIN, 11);
        JButton button1 = new JButton("LEFT_ALIGNMENT");
        panel.add(button1);
        button1.setAlignmentX(JComponent.LEFT_ALIGNMENT);
        button1.setMaximumSize(new Dimension(160, 100));
        button1.addActionListener(listener);
        button1.setFocusable(false);
        button1.setFont(font);
        JButton button2 = new JButton("LEFT_ALIGNMENT");
        panel.add(button2);
        button2.setAlignmentX(JComponent.LEFT_ALIGNMENT);
        button2.setMaximumSize(new Dimension(200, 100));
        button2.addActionListener(listener);
        button2.setFocusable(false);
        button2.setFont(font);
        JButton button3 = new JButton("LEFT_ALIGNMENT");
        panel.add(button3);
        button3.setAlignmentX(JComponent.LEFT_ALIGNMENT);
        button3.setMaximumSize(new Dimension(250, 100));
        button3.addActionListener(listener);
        button3.setFocusable(false);
        button3.setFont(font);
         
        frame.getContentPane().add(panel);
         
        frame.setPreferredSize(new Dimension(300, 220));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame.setDefaultLookAndFeelDecorated(true);
                createGUI();
            }
        });
    }
}
Использование менеджера компоновки BoxLayout.
BoxLayout дуже цікавий механізм вирівнювання компонентів. Залежно від того, яким чином BoxLayout розміщені компоненти всередині (по вертикалі або по по горизонталі), вирівнювання задається відповідно. Якщо BoxLayout вертикальний (BoxLayout.Y_AXIS), то кожному компоненту задати вирівнювання за лівим краєм, по центру або по правому краю. Якщо BoxLayout горизонтальний (BoxLayout.X_AXIS), то вирівнювати можна по верху, по центру або по низу. Для того, щоб не навантажувати зайвим текстом з поясненням особливостей вирівнювання по вертикалі, давайте подивимося тестовий приклад, який нам все демонструє.

На формі є панель JPanel. Панель використовує BoxLayout, для якої при створенні передавався параметр BoxLayout.X_AXIS, який говорить уздовж якої осі розташовувати компоненти. В даному випадку уздовж осі X. На панель JPanel поміщається три кнопки, для якої можна задавати вирівнювання незалежно від інших кнопок. Робиться це шляхом натискання на кнопку. Як тільки кнопка була натиснута, спрацьовує обробник. Оброблювач змінює напис на кнопці, яка інформує про те, яка константа була передана методу setAlignmentY - JComponent.TOP_ALIGNMENT (вирівнювання по верхньому краю), JComponent.CENTER_ALIGNMENT (вирівнювання по центру) або JComponent.BOTTOM_ALIGNMENT (вирівнювання по нижньому краю).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestFrame extends JFrame {
     
    public static void createGUI() {
        JFrame frame = new JFrame("Test frame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
         
        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Object source = e.getSource();
                if(source instanceof JButton) {
                    JButton button = (JButton) e.getSource();
                    float align = button.getAlignmentY();
                    String title = "";
                    if(align == JComponent.TOP_ALIGNMENT) {
                        align = JComponent.CENTER_ALIGNMENT;
                        title = "CENTER_ALIGNMENT";
                    } else if (align == JComponent.CENTER_ALIGNMENT) {
                        align = JComponent.BOTTOM_ALIGNMENT;
                        title = "BOTTOM_ALIGNMENT";
                    } else {
                        align = JComponent.TOP_ALIGNMENT;
                        title = "TOP_ALIGNMENT";
                    }
                    button.setText(title);
                    button.setAlignmentY(align);                   
                }                                              
            }          
        };
         
        Font font = new Font("Verdana", Font.PLAIN, 11);
        JButton button1 = new VerticalButton("TOP_ALIGNMENT", false);
        panel.add(button1);
        button1.setAlignmentY(JComponent.TOP_ALIGNMENT);
        button1.setMaximumSize(new Dimension(100, 160));
        button1.addActionListener(listener);
        button1.setFocusable(false);
        button1.setFont(font);
        JButton button2 = new VerticalButton("TOP_ALIGNMENT", false);
        panel.add(button2);
        button2.setAlignmentY(JComponent.TOP_ALIGNMENT);
        button2.setMaximumSize(new Dimension(100, 200));
        button2.addActionListener(listener);
        button2.setFocusable(false);
        button2.setFont(font);
        JButton button3 = new VerticalButton("TOP_ALIGNMENT", false);
        panel.add(button3);
        button3.setAlignmentY(JComponent.TOP_ALIGNMENT);
        button3.setMaximumSize(new Dimension(100, 250));
        button3.addActionListener(listener);
        button3.setFocusable(false);
        button3.setFont(font);
         
        frame.getContentPane().add(panel, BorderLayout.CENTER);
         
        frame.setPreferredSize(new Dimension(250, 250));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame.setDefaultLookAndFeelDecorated(true);
                createGUI();
            }
        });
    }
}
.