Менеджеры размещения в Java

Перед использованием управляющих компонентов (например, кнопок) их надо расположить на форме в нужном порядке. Вместо ручного расположения применяются менеджеры размещения, определяющие способ, который панель использует для задания порядка размещения управляющего элемента на форме. Менеджеры размещения контролируют, как выполняется позиционирование компонентов, добавляемых в окна, а также их упорядочение. Если пользователь изменяет размер окна, менеджер размещения переупорядочивает компоненты в новой области так, чтобы они оставались видимыми и в то же время сохранили свои позиции относительно друг друга.

Менеджер размещения представляет собой один из классов FlowLayout, BorderLayout, GridLayout, CardLayout, BoxLayout, реализующих интерфейс LayoutManager, устанавливающий размещение.

Класс FlowLayout – менеджер поточной компоновки. При этом компо­ненты размещаются от левого верхнего угла окна, слева направо и сверху вниз, как и обычный текст. Этот менеджер используется по умолчанию при добавлении компонентов в апплеты. При использовании библиотеки AWT менеджер FlowLayout представляет собой класс, объявленный следующим образом:

public class FlowLayout extends Object

implements LayoutManager, Serializable { }

В следующем примере демонстрируются возможности поточной компоновки различных элементов управления.

/* пример # 1 : поточная компоновка по центру: FlowLayoutEx.java */

package chapt13;

import java.awt.*;

import javax.swing.*;

public class FlowLayoutEx extends JApplet {

private Component c[] = new Component[9];

public void init() {

String[] msg =

{ "Метка 1", "Метка 2", "Метка 3" };

String[] str =

{ "Кнопка 1", "Кнопка 2", "Кнопка 3" };

String[] txt = {"Текст 1", "Текст 2", "Текст 3"};

//установка менеджера размещений

setLayout(new FlowLayout());

setBackground(Color.gray);

setForeground(Color.getHSBColor(1f, 1f, 1f));

for (int i = 0; i < c.length/3; i++) {

c[i] = new JButton(str[i]);

add(c[i]);

c[i + 3] = new JLabel(msg[i]);

add(c[i + 3]);

c[i+6] = new JTextField(txt[i]);

add(c[i + 6]);

}

setSize(450, 150);

}

}

Перегружаемый метод add(Component ob), определенный в классе java.awt.Container (подклассе Component), добавляет компоненты JButton, JLabel, JTextField к окну и прорисовывает их всякий раз, когда окно отображается на экран.

Метод setLayout(LayoutManager mgr) устанавливает менеджер размещения для данного контейнера. Результаты работы апплета приведены на рисунке.

clip_image002

clip_image004

Рис. 13.1. Размещение компонентов FlowLayout

Менеджер GridLayout разделяет форму на заданное количество рядов и колонок. В отличие от него компоновка BoxLayout размещает некоторое количество компонентов по вертикали или горизонтали. На способ расположения компонентов изменение размеров формы не влияет.

/* пример # 2 : компоновка в табличном виде: GridLayoutEx.java */

package chapt13;

import javax.swing.*;

import java.awt.*;

public class GridLayoutEx extends JApplet {

private Component b[] = new Component[7];

public void init() {

setLayout(new GridLayout(2, 4));/*две строки,

четыре столбца*/

for (int i = 0; i < b.length; i++)

add((b[i] = new JButton("(" + i + ")")));

}

}

clip_image006

Рис. 13.2. Размещение компонентов GridLayout

Менеджер BorderLayout позволяет позиционировать элементы и группы из них в областях фиксированного размера, граничащих со сторонами фрейма, которые обозначаются параметрами сторонами света: NORTH, SOUTH, EAST, WEST. Остальное пространство обозначается как CENTER.

/* пример # 3 : фиксированная компоновка по областям:

BorderGridLayoutDemo.java */

package chapt13;

import java.awt.BorderLayout;

import java.awt.GridLayout;

import java.awt.Container;

import javax.swing.JPanel;

import javax.swing.JFrame;

import javax.swing.JButton;

import javax.swing.JToggleButton;// «западающая» кнопка

public class BorderGridLayoutDemo extends JFrame {

public BorderGridLayoutDemo() {

Container c = getContentPane();

c.setLayout(new BorderLayout());

c.add(new JToggleButton("–1–"), BorderLayout.WEST);

c.add(new JToggleButton("–2–"), BorderLayout.SOUTH);

c.add(new JToggleButton("–3–"), BorderLayout.EAST);

JPanel jPanel = new JPanel();

c.add(jPanel, BorderLayout.NORTH);

jPanel.setSize(164, 40);

jPanel.setLayout(new GridLayout(2, 4));

for (int i = 0; i < 7; i++)

jPanel.add(new JButton("" + i));

}

public static void main(String[] args) {

BorderGridLayoutDemo fr =

new BorderGridLayoutDemo();

fr.setSize(300, 200);

fr.setTitle("Border & Grid Layouts Example");

fr.setDefaultCloseOperation(EXIT_ON_CLOSE);

fr.setVisible(true);

}

}

clip_image008

Рис. 13.3. Размещение компонентов BorderLayout и GridLayout

Компоновка BoxLayout позволяет группировать элементы в подобластях фрейма в строки и столбцы. Возможности класса Box позволяют размещать компоненты в рамке, ориентированной горизонтально или вертикально.

/* пример # 4 : компоновка в группах с ориентацией: BoxLayoutDemo.java */

package chapt13;

import java.awt.BorderLayout;

import java.awt.Container;

import java.awt.Font;

import javax.swing.Box;

import javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JToggleButton;

import javax.swing.border.EtchedBorder;

import javax.swing.border.TitledBorder;

public class BoxLayoutDemo extends JFrame {

public BoxLayoutDemo() {

Container c = getContentPane();

setBounds(20, 80, 300, 300);

c.setLayout(new BorderLayout());

Box row = Box.createHorizontalBox();

for (int i = 0; i < 4; i++) {

JButton btn = new JButton("Кн " + i);

btn.setFont(new Font("Tahoma", 1, 10 + i * 2));

row.add(btn);

}

c.add(row, BorderLayout.SOUTH);

JPanel col = new JPanel();

col.setLayout(

new BoxLayout(col, BoxLayout.Y_AXIS));

col.setBorder(

new TitledBorder(new EtchedBorder(), "Столбец"));

for (int i = 0; i < 4; i++) {

JToggleButton btn =

new JToggleButton("Кнопка " + i);

col.add(btn);

}

c.add(col, BorderLayout.WEST);

}

public static void main(String[] args) {

BoxLayoutDemo frame = new BoxLayoutDemo();

frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

clip_image010

Рис. 13.4. Размещение компонентов BoxLayout и Box

Для того чтобы располагать компоненты в произвольных областях фрейма, следует установить для менеджера размещений значение null и воспользоваться методом setBounds().

/* пример # 5 : произвольное размещение: NullLayoutEx.java */

package chapt13;

import java.awt.Container;

import javax.swing.*;

public class NullLayoutEx extends JFrame {

public NullLayoutEx() {

Container c = getContentPane();

//указание размеров фрейма

setBounds(20, 80, 300, 300);

c.setLayout(null);

JButton jb = new JButton("Кнопка");

//указание координат и размеров кнопки

jb.setBounds(200, 50, 90, 40);

c.add(jb);

JTextArea jta = new JTextArea();

//указание координат и размеров текстовой области

jta.setBounds(10, 130, 180, 70);

jta.setText("Здесь можно вводить текст");

c.add(jta);

}

public static void main(String args[]) {

NullLayoutEx nl = new NullLayoutEx();

nl.setDefaultCloseOperation(EXIT_ON_CLOSE);

nl.setVisible(true);

}

}

clip_image012

Рис. 13.5. Произвольное размещение компонентов

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100