Swing компоновщики
компонувальники
Менеджери компонування використовуються для автоматичного позиціонування і завдання розмірів дочірніх елементів в контейнері. Компонувальником є будь-який об'єкт реалізує інтерфейс LayoutManager або LayoutManager2 (підтримує вирівнювання і обмеження).
стандартні компоновщики
- BorderLayout - розміщує елементи в один з п'яти регіонів, як було зазначено при додаванні елемента в контейнер: наверх, вниз, вліво, вправо, в центр. За замовчуванням елемент додається в центр. Якщо в зазначеному регіоні вже є елемент, то він заміщається новим. Тому, коли треба розмістити кілька елементів в одному регіоні, то їх об'єднують в один контейнер (зазвичай JPanel);
- FlowLayout - розміщує елементи по порядку в тому ж напрямку, що і орієнтація контейнера (зліва на право за замовчуванням) застосовуючи один з п'яти видів вирівнювання, зазначеного при створенні менеджера. Даний менеджер використовується за умовчанням;
- GridLayout - розміщує елементи таблично. Кількість стовпців і рядків вказується при створенні менеджера. За замовчуванням один рядок, а число стовпців дорівнює кількості елементів. Вся область контейнера розбивається на осередки і розмір кожного елемента встановлюється в розмір осередку. Це більше підходить для вирівнювання панелей та інших контейнерів, а не елементів управління (нам ж не потрібні гігантські кнопки);
- BoxLayout - розміщує елементи по вертикалі або по горизонталі. Зазвичай він використовується не безпосередньо, а через контейнерний клас Box (ящик).
точне позиціонування і завдання розмірів
Якщо в контейнері відсутня компоновщик (був викликаний метод контейнера setLayout (null)), то позицію і розміри елементів необхідно задати явно методами елемента
- setLocation (Point p) - перемістити компонент в зазначену точку;
- setLocation (int x, int y) - перемістити компонент в зазначену точку;
- setSize (Dimension d) - встановити розміри компонента;
- setSize (int width, int height) - встановити розміри компонента;
- setBounds (Rectangle r) - перемістити і встановити розміри компонента (вписати в чотирикутник);
- setBounds (int x, int y, int width, int height) - перемістити і встановити розміри компонента.
кращі розміри
Компоненти володіють мінімальними, максимальними і переважними розмірами. Деякі компоновщики використовують ці параметри, а значить можна вплинути на їх роботу, змінюючи їх. Ці розміри також можуть стати в нагоді при розробці власного компоновщика. Якщо все розміри компонента рівні, то говорять, що у компонента фіксований розмір. Отримати і встановити ці значення можна методами:
- getMaximumSize () - отримання максимального розміру;
- setMaximumSize (Dimension d) - установка максимального розміру;
- getMinimumSize () - отримання мінімального розміру;
- setMinimumSize (Dimension d) - установка мінімального розміру;
- getPreferredSize () - отримання бажаного розміру;
- setPreferredSize (Dimension d) - установка бажаного розміру.
компоновщики низького рівня
Існує також два компоновщика низького рівня, розроблених для програм построителей форм SpringLayout і GroupLayout. У документації для SpringLayout можна скачати файлик SpringUtilities.java, де реалізовані два корисних способу компонування на його основі (як там сказано просто викликаємо методи з цього файлу, не вникаючи в деталі :).
Клас Box реалізує контейнер з компоновщиком BoxLayout. Якщо елементи розміщуються по горизонталі, то висота всіх елементів дорівнює висоті найвищого елемента. А ширина елементів така, щоб заповнити весь контейнер по ширині. При зміні ширини контейнера елементи розтягуються пропорційно. Якщо у всіх елементів досягнута межа розтягування (значення getMaximumSize ()), то перший елемент розтягується насильно. Якщо залишається хоча б один елемент доступний для розтягування, то розтягується тільки він.
Подібним чином відбувається і вертикальне розміщення. Ширина всіх елементів дорівнює ширині самого широкого елемента, а висота елеметов така, щоб заповнити весь контейнер по висоті. При цьому може знадобиться явне завдання вирівнювання елементів методом setAlignmentX. Інакше навіть при однаковій ширині, елементи не будуть збудовані в красивий стовпчик.
Клас Box має статичні методи для створення невидимих елементів для різних цілей:
- createHorizontalStrut (int width) - створює компонент з фіксованою шириною. При горизонтальному укладанні елемент використовується щоб звільнити простір між сусідніми елементами, інакше елементи будуть впритул. При вертикальному укладанні елемент використовується для завдання мінімальної ширини інших елементів;
- createVerticalStrut (int height) - створює компонент з фіксованою висотою. При вертикальному укладанні елемент використовується щоб звільнити простір між сусідніми елементами, інакше елементи будуть впритул. При горизонтальному укладанні елемент використовується для завдання мінімальної висоти інших елементів;
- createRigidArea (Dimension d) - створює невидимий елемент фіксованого розміру;
- createGlue () - створює невидимий розтягується компонент. Використовується, щоб запобігти насильницьке розтягнення елементів. Наприклад, нехай в контейнері видимі елементи фіксованого розміру. Тоді поклавши даний компонент в початок і в кінець контейнера, ми отримаємо центрування видимих елементів. А якщо розташувати його після кожного видимого, то при збільшенні розміру контейнера, видимі елементи "розійдуться" один від одного.