фиксирована только ширина. При горизонтальном расположении компонентов распорку можно использовать для создания промежутков между компонентами, а при вертикальном расположении — для задания ширины всей панели.
У вертикальной распорки, создаваемой статическим методом
static Component Box.createVerticalStrut(int height);
фиксирована высота. Она используется аналогично горизонтальной распорке.
Третий вид заполнителя — невидимая
□ static Component Box.createGlue () — "подушка" раздувается во все стороны;
□ static Component Box.createHorizontalGlue() — "подушка" раздается в ширину;
□ static Component Box.createVerticalGlue() — "подушка" раздается в высоту.
Кроме этих трех компонентов-разделителей можно использовать невидимый компонент с фиксированным минимальным, максимальным и предпочтительным размерами. Он является объектом класса Filler, вложенного в класс Box, и создается конструктором
Box.Filler(Dimension min, Dimension pref, Dimension max);
Преимущество этого объекта в том, что он может поменять размеры методом
void changeShape(Dimension min, Dimension pref, Dimension max);
Листинг 14.8 показывает пример размещения текстовой области и двух кнопок на панели класса Box. Для того чтобы сдвинуть кнопки вправо, применена "подушка".
import java.awt.*; import javax.swing.*;
public class MyBox extends JFrame{
JButton b1 = new JButton("Первая");
JButton b2 = new JButton("Вторая");
JTextArea ta = new JTextArea(5, 30);
MyBox(){
super(" Линейная панель"); setLayout(new FlowLayout());
Box out = Box.createVerticalBox();
Box ini = Box.createHorizontalBox();
Box in2 = Box.createHorizontalBox();
out.add(ini); out.add(in2);
ini.add(ta);
in2.add(Box.createHorizontalGlue());
in2.add(b1); in2.add(b2);
add(outer);
setSize(400, 400);
setDefaultCloseOperation(EXIT ON CLOSE); setVisible(true);
}
public static void main(String[] args){ new MyBox();
}
}
Итак, класс Box, использующий разделители, становится удобным и гибким контейнером. Нужно еще учесть, что компоненты можно обвести рамкой необходимой ширины и то, что контейнеры класса Box могут вкладываться друг в друга в разных сочетаниях. Все это делает класс Box вполне приемлемым контейнером для размещения самых разных компонентов, а не только инструментальных кнопок.
Контейнер Box, управляемый менеджером размещения BoxLayout, оказался удобным средством компоновки компонентов, но для сложного размещения большого числа
компонентов приходится вкладывать экземпляры класса Box друг в друга. К тому же возникает необходимость часто применять компоненты-разделители. Это приводит к неоправданной сложности компоновки.
Вообще говоря, возможности размещения компонентов в контейнерах графических библиотек AWT и Swing очень велики и изменяются в широком диапазоне.
На одном конце этого диапазона — абсолютное размещение, при котором прямо указываются координаты (x, y), ширина width и высота height компонента в координатной системе контейнера. Это выполняет метод
setBounds(int x, int y, int width, int height);
или пара методов
setLocation(int x, int y); setSize(int width, int height);
При этом компоненты совершенно точно помещаются в контейнер, но их положение и размеры не меняются при изменении размеров контейнера. Можно связать координаты и размеры компонента с размерами контейнера, например:
JPanel p = new JPanel(); p.setLayout(null);
int w = p.getSize().width, h = p.getSize().height;
JButton b = new JButton("Выход"); b.setBounds(w/10, h/10, w/5, h/8); p.add(b);
Это сложно и требует долгой кропотливой подгонки.
На другом конце диапазона — менеджер размещения FlowLayout, располагающий компоненты просто по их предпочтительному размеру, и менеджер GridLayout, подгоняющий размеры всех компонентов под размер контейнера.
В состав Java SE, начиная с версии JDK 1.4, введен новый менеджер размещения SpringLayout, пытающийся совместить точность и гибкость размещения компонентов. Для определения положения и размеров компонента этот менеджер пользуется координатами (x, y) и размерами width, height, но это не числа, а объекты специально разработанного небольшого класса Spring. Опишем этот класс.
Размеры
Абстрактный класс Spring описывает объекты, хранящие размеры. Каждый объект хранит минимальный, предпочтительный и максимальный размеры. Эти размеры могут использоваться как размеры промежутков между компонентами. Поскольку класс Spring абстрактный, объект с размерами задается не конструктором, а статическим методом
public static Spring constant(int min, int pref, int max);
Второй статический метод, constant(int size), возвращает объект класса Spring с совпадающими между собой размерами, равными size.