BorderLayout – пять частей света

BorderLayout – это один из layout Java Swing, который используется для расположения компонентов на контейнере. Принцип, который использует BorderLayout для компоновки прост – всё пространство контейнера разбивается на пять частей. В каждой из этих частей располагается один компонент. При добавлении компонента на контейнер с BorderLayout разработчик обязательно указывает, куда именно он хочет поместить компонент. Посмотрим на конкретном примере, как установить у контейнера BorderLayout.

Предположим у нас есть панель JPanel. Мы хотим, чтобы расположением компонентов на панели занимался BorderLayout. Создаем панель и указываем layout при помощи метода setLayout вот так:

JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());

Далее создаем компоненты и добавляем на панель. При добавлении на панель необходимо указать, в какой именно части будет располагаться компонент. Делается это следующим образом:

JButton button = new JButton(“Test button”);
panel.add(button, BorderLayout.PAGE_START);

Как видно из примера, добавление осуществляется при помощи метода add, но c двумя параметрами. Первый параметр – это компонент, который хотим добавить. Второй параметр – константа класса BorderLayout, с помощью которой разработчик говорит BorderLayout’у контейнера, где расположить компонент. Таких констант у BorderLayout несколько. Для того чтобы понять, какая константа отвечает за какую часть посмотрим на рисунок ниже.

border_layout

Думаю так нагляднее. Чтобы лучше понять то, как BorderLayout растягивает компонент (по высоте или ширине контейнера) можно поэкспериментировать – добавлять не сразу все компоненты, а по очереди. К примеру, PAGE_START и PAGE_END растягивают компонент по всей ширине контейнера, при этом высоту не трогают, а LINE_START и LINE_END меняют только высоту компонента, а ширину оставляют нетронутой, CENTER заполняет компонентом всё оставшееся место. Стоит сказать, что не обязательно забивать все пять частей. Можно, к примеру, оставить только PAGE_START, LINE_START и CENTER. Тогда получится вот так:

border_layout1

BorderLayout очень хорошо подходит для приложений, окна которых не имеют строго заданных размеров. Пользователь на своё усмотрение может менять размер окна, а его содержимое растягивается вместе с ним. В тестовых примерах добавлялись только кнопки, но можно оперировать также и с контейнерами. Компоновка контейнеров будет происходит аналогичным образом.
Если заглянуть в константы класса BorderLayout, то там можно увидеть вот такие NORTH, SOUTH и так далее. Работают они аналогично описанным выше. Для чего добавлены новые константы мне, если честно не вполне ясно. Но на практике работают и те, и другие. По мне – лучше использовать NORTH, SOUTH, WEST – стороны света как-то лучше воспринимаются. Вот и получается BorderLayout – пять частей света 🙂

package al.catalog;

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestFrame {

     public static void createGUI() {
          JFrame.setDefaultLookAndFeelDecorated(true);
          JFrame frame = new JFrame("Test frame");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JPanel panel = new JPanel();
          panel.setLayout(new BorderLayout());

          JButton northButton = new JButton("NORTH (PAGE_START)");
          panel.add(northButton, BorderLayout.NORTH);

          JButton southButton = new JButton("SOUTH (PAGE_END)");
          panel.add(southButton, BorderLayout.SOUTH);

          JButton eastButton = new JButton("EAST (LINE_START)");
          panel.add(eastButton, BorderLayout.EAST);

          JButton westButton = new JButton("WEST (LINE_END)");
          panel.add(westButton, BorderLayout.WEST);

          JButton centerButton = new JButton("CENTER");
          panel.add(centerButton, BorderLayout.CENTER);

          frame.getContentPane().add(panel);
          frame.setPreferredSize(new Dimension(550, 300));

          frame.pack();
          frame.setVisible(true);
          frame.setLocationRelativeTo(null);
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    createGUI();
               }
          });
     }
}

Реклама

4 Responses to BorderLayout – пять частей света

  1. cyper_ says:

    Лучший компоновщик это GridBagLayout или переделанный под удобство использования — GBC http://www.horstmann.com/articles/GBC.java. Им можно делать все.

    • bondforever says:

      Если честно, то GridBagLayout’ом пару раз от силы использовал, привык комбинированием других обходиться. Хочу с ним подразобраться, быть может зря я на него внимания не обращал.

      • cyper_ says:

        Впринципе если GUI простой, то можно обойтись и другими, но когда надо красиво разместить много компонентов в фрейме то удобнее GridBagLayout’ом

  2. neleon says:

    По поводу констант PAGE_START, PAGE_END, LINE_START, LINE_END. Данные константы дают не такой же эффект, что и «стороны света». Подробнее можно прочитать в этой статье http://skipy.ru/technics/layouts.html

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: