Два статических метода берут координату height или координату width у минимального, предпочтительного и максимального размеров заданного компонента comp:
public static Spring height(Component comp); public static Spring width(Component comp);
Итак, на объект класса Spring можно смотреть как на трехмерный вектор
(min, pref, max) .
Кроме этих трех размеров, объект хранит еще и текущее значение value, устанавливаемое методом setValue(int value). Значение value должно лежать между минимальным и максимальным значениями. Начальное значение value совпадает с предпочтительным размером.
Менеджер размещения получает эти размеры, обращаясь к методам getMinimumValue(),
getMaximumValue(), getPreferredValue(), getValue().
Очень часто менеджер размещения SpringLayout использует несколько объектов Spring. При этом их размеры складываются, вычитаются, берется наибольший или наименьший размер. Все операции выполняются, как операции с векторами, покоординатно. Для удобства их выполнения в класс Spring введены статические методы таких вычислений:
□ public static Spring max(Spring s1, Spring s2) — возвращает новый объект, размеры которого составлены из наибольших значений объектов s1 и s2;
□ public static Spring minus(Spring s) - возвращает новый объект, размеры которого
равны размерам объекта s с обратным знаком;
□ public static Spring sum(Spring s1, Spring s2) — возвращает новый объект, размеры которого равны сумме соответствующих размеров объектов s1 и s2.
Для вычисления минимального из двух значений s1 и s2 нет специального метода, оно вычисляется так:
Spring sp = Spring.minus(Spring.max(Spring.minus(s1), Spring.minus(s2)));
Промежутки
Объект класса Spring — всего лишь четверка чисел. Он не может определить пространство в контейнере, а используется только для построения объекта вложенного класса
SpringLayout.Constraints.
Объект класса Constraints, подобно прямоугольнику, содержит координаты (x, y), ширину width и высоту height, но эти величины — не числа, а объекты класса Spring. Объекты x и y — не жестко фиксированные координаты левого верхнего угла, как в прямоугольнике. Они имеют наименьшее, наибольшее, предпочтительное и текущее значения, которыми пользуется менеджер размещения SpringLayout. Он варьирует положение левого верхнего угла компонента в заданных объектами x и y пределах. Поэтому они обозначаются статическими строковыми константами WEST и NORTH класса SpringLayout. Ширина width и высота height — это наименьшая, наибольшая, предпочтительная и текущая ширина и высота компонента в контейнере, управляемом менеджером размещения SpringLayout. Чаще всего они совпадают с соответствующими значениями самого компонента. Величины x + width и y + height обозначаются статическими строковыми константами east и south и определяют положение правого нижнего угла компонента.
Для получения и установки всех этих значений в классе Constraints есть методы-"сеттеры" и "геттеры": setX(Spring), getX(), setY(Spring), getY(), setWidth(Spring), getWidth(), setHeight(Spring), getHeight(). Методы setConstraint(String, Spring) и getConstraint (String) устанавливают и выдают объект класса Spring по заданному имени
NORTH, WEST, SOUTH или EAST.
Размещение компонентов
После обсуждения этих вспомогательных классов можно объяснить принцип работы менеджера размещения SpringLayout на примере.
Допустим, мы хотим расположить несколько компонентов comp[0], comp [1], comp [2] и т. д. в одну строку с фиксированными промежутками между ними величиной в 6 пикселов. Кроме того, мы решили оставить промежутки в 10 пикселов от границ контейнера. Листинг 14.9 содержит программу, выполняющую такое размещение, а рис. 14.9 показывает результат размещения.
Листинг 14.9. Размещение компонентов SpringLayout
import java.awt.*; import javax.swing.*;
public class SpringWin extends JFrame{
JComponent[] comp = {
new JButton("Длинная надпись"),
new JButton("Надпись с^> двумя строками"),
new JButton("OK")
};
public SpringWin(){
super(" Размещение SpringLayout");
SpringLayout sl = new SpringLayout(); setLayout(sl);
// Задаем величину промежутка между компонентами Spring xPad = Spring.constant(6);
// Задаем величину отступа от границ контейнера Spring yPad = Spring.constant(10);
// Текущее положение левого верхнего угла Spring currX = yPad;
// Наибольшая высота компонента, пока 0 Spring maxHeight = Spring.constant(0);
for (int i = 0; i < comp.length; i++){ add(comp[i]);
// Получаем размер i-го компонента SpringLayout.Constraints cons = sl.getConstraints(comp[i]);
// Устанавливаем положение i-го компонента cons.setX(currX); cons.setY(yPad);
// Перемещаем текущее положение угла currX = Spring.sum(xPad, cons.getConstraint("East"));
/ / Изменяем наибольшую высоту
maxHeight = Spring.max(maxHeight, cons.getConstraint("South"));
}
// Получаем размеры контейнера SpringLayout.Constraints pCons = sl.getConstraints(c);