Диспетчер компоновки BorderLayout по умолчанию устанавливается для панели содержимого, присутствующей в объекте JFrame. В отличие от диспетчера FlowLayout, который полностью контролирует позицию каждого компонента, диспетчер BorderLayout позволяет вам выбрать место для каждого компонента.
Компонент можно разместить в центре панели, в ее верхней или нижней части, а также слева или справа.
Например:
1 |
frame.add(component, BorderLayout.SOUTH); |
При размещении компонентов сначала выделяется место по краям контейнера, а оставшееся свободным пространство считается центральной областью. При изменении размера контейнера компонентов, расположенных по краям, остается постоянной, изменяется лишь размер центральной области.При добавлении компонента к панели указываются константы CENTER(центральный), NORTH(северная), SOUTH(южная), EATH(восточная) или WEST(западная), определенные в классе BorderLayout. Занимать все позиции в панели не обязательно. Если не указано никакого значения, по умолчанию принимается CENTER.
Константы в классе BorderLayout определены как строки. Например, константа BorderLayout.SOUTH — это строка «South». Многие программисты предпочитают использовать непосредственно строки, поскольку они короче, например contentPane.add(component, «South»). Однако если вы случайно сделаете в строке опечатку, компилятор не распознает этой ошибки.
В отличие от FlowLayout, диспетчер компоновки BorderLayout растягивает все компоненты, так чтобы они заполняли все свободные пространство. (Как вы помните, диспетчер FlowLayout оставляет размеры компонента неизменными). Это может привести к проблеме при добавлении кнопки:
1 |
frame.add(yellowButton, BorderLayout.SOUTH); // не делайте так! |
На рис.2 показано, что произойдет, если мы попробуем применить фрагмент кода, приведенный выше. Размеры кнопки увеличатся, и она заполнит собой всю нижнюю часть фрейма. Если мы попытаемся вставить в нижнюю часть еще одну кнопку, она заменит собой предыдущую кнопку.
Один из способов решить эту проблему заключается в использовании дополнительных панелей. Например, обратите внимание на рис.3. В панели, расположенной в нижней части панели содержимого, размещены три кнопки.
Чтобы достичь такой конфигурации, сначала создается новый объект JPanel, к которому затем добавляются отдельные кнопки. Как вы уже знаете, по умолчанию с обычной панелью связывается диспетчер компоновки FlowLayout. В данной ситуации он вполне подходит. В панель с помощью метода add() помещается отдельные кнопки(эту процедуру мы уже рассматривали ранее).
Рис.1. Одиночная кнопка, управляемая диспетчером компоновки BorderLayout.
Рис.2. Панель, размещенная в нижней части фрейма
Поскольку мы не переопределяли диспетчер компоновки, то положением кнопок управляет FlowLayout. Это значит, что кнопки будут выровнены по центру панели и масштаб их будет увеличен для заполнения всего свободного пространства.
Следующий фрагмент кода добавляет в нижнюю часть контейнера панель, содержащую три кнопки:
1 2 3 4 5 |
JPanel panel = new JPanel(); panel.add(yellowButton); panel.add(blueButton); panel.add(redButton); frame.add(panel, BorderLayout.SOUTH); |
BorderLayout расширяет размер панели с тремя кнопками, чтобы она заняла всю нижнюю область.