Как растягивать компоненты при растяжении окна в java

Как растягивать компоненты при растяжении окна в java thumbnail

GridPane

Последнее обновление: 07.06.2018

Контейнер javafx.scene.layout.GridPane упорядочивает вложенные элементы в виде таблицы. Для каждого элемента можно задать в какой строке и каком столбце грида он будет
располагаться.

Добавление элементов

Для добавления элементов GridPane определяет свой метод add(), который имеет несколько версий. Некоторые из них:

void add​(Node child, int columnIndex, int rowIndex)
void add​(Node child, int columnIndex, int rowIndex, int colspan, int rowspan)

Оба метода добавляют элемент child в строку с индексом rowIndex и в столбец с индексом columnIndex. Во втором методе параметры colspan и rowspan
указывают соответственно, на сколько столбцов и строк надо растягивать элемент.

Например:

GridPane gridpane = new GridPane();
gridpane.add(new Button(), 1, 0); // столбец=1 строка=0
gridpane.add(new Label(), 2, 0); // столбец=2 строка=0

Также для добавления можно использовать стандартный для других панелей компоновки способ — метод getChildren().getAll(), который определен в родительском классе Pane.
Но в этом случае все добавляемые элементы будут помещаться в самую первую ячейку. В этом случае мы можем использовать еще ряд методов для установки строки и столбца, в которе помещается элемент:

static void setColumnIndex​(Node child, Integer value) // устанавливает столбец
static void setColumnSpan​(Node child, Integer value) // устанавливает строку
static void setConstraints​(Node child, int columnIndex, int rowIndex) // устанавливает столбец и строку

Установка столбца и строки для добавляемых элементов:

GridPane gridpane = new GridPane();

Button button = new Button();
GridPane.setRowIndex(button, 0); // строка=0
GridPane.setColumnIndex(button, 1); // столбец=1

Label label = new Label();
GridPane.setConstraints(label, 2, 0); // столбец=2 строка=0

Установка размеров столбцов и строк

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

Столбцы

С помощью метода getColumnConstraints() можно получить коллекцию определений столбцов в виде объекта
ObservableList<ColumnConstraints>. Определение столбца представляет класс javafx.scene.layout.ColumnConstraints.

Чтобы создать определение столбца, можно использовать один из следующих конструкторов:

  • ColumnConstraints()

  • ColumnConstraints​(double width): создает столбец с фиксированной шириной

  • ColumnConstraints​(double minWidth, double prefWidth, double maxWidth): создает столбец с фиксированными значениями
    минимальной, предпочтительной и максимальной ширины

  • ColumnConstraints​(double minWidth, double prefWidth, double maxWidth, Priority hgrow, HPos halignment, boolean fillWidth):
    создает столбец с фиксированными значениями минимальной, предпочтительной и максимальной ширины, hgrow устанавливает параметры расширения столбца,
    halignment устанавливает выравнивание по горизонали, а fillWidth при значении true задает растяжение элемента до границ столбца

Добавление в грид двух столбцов с фиксированными размерами:

GridPane grid = new GridPane();
grid.getColumnConstraints().add(new ColumnConstraints(100)); // столбец с шириной от 0 до 100
grid.getColumnConstraints().add(new ColumnConstraints(200)); // столбец с шириной от 0 до 200

Однако при задании фиксированной ширины мы можем столкнуться с проблемой, что если окно приложения начнет растягиваться, то столбцы сохранят свои
размеры. В итоге некоторая часть пространства останется незанятой:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.ColumnConstraints;

public class Main extends Application{

public static void main(String[] args) {

Application.launch(args);
}

@Override
public void start(Stage stage) {

Label first = new Label(«First»);
Label second = new Label(«Second»);
Label third = new Label(«Third»);

GridPane root = new GridPane();
root.getColumnConstraints().add(new ColumnConstraints(80));
root.getColumnConstraints().add(new ColumnConstraints(150));
root.getColumnConstraints().add(new ColumnConstraints(70));

root.setGridLinesVisible(true); // делаем видимой сетку строк и столбцов
root.setColumnIndex(first, 0);
root.setColumnIndex(second, 1);
root.setColumnIndex(third, 2);
root.getChildren().addAll(first, second, third);

Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);

stage.setTitle(«GridPane in JavaFX»);

stage.show();
}
}

Чтобы отобразить границы строк и столбцов вызывается метод root.setGridLinesVisible(true).

Пример растягивания окна при фиксированной ширине столбцов:

Столбцы с фиксированной шириной в GridPane и JavaFX

В этом случае с помощью перечисления Priority можно настроить параметры растягивания столбца:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Priority;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.ColumnConstraints;

public class Main extends Application{

public static void main(String[] args) {

Application.launch(args);
}

@Override
public void start(Stage stage) {

Label first = new Label(«First»);
Label second = new Label(«Second»);
Label third = new Label(«Third»);

GridPane root = new GridPane();
root.getColumnConstraints().add(new ColumnConstraints(80));
ColumnConstraints column2 = new ColumnConstraints(150,150,Double.MAX_VALUE);
column2.setHgrow(Priority.ALWAYS);
root.getColumnConstraints().add(column2);

ColumnConstraints column3 = new ColumnConstraints(70,70,Double.MAX_VALUE);
column3.setHgrow(Priority.ALWAYS);
root.getColumnConstraints().add(column3);

root.setGridLinesVisible(true);
root.setColumnIndex(first, 0);
root.setColumnIndex(second, 1);
root.setColumnIndex(third, 2);
root.getChildren().addAll(first, second, third);

Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);

stage.setTitle(«GridPane in JavaFX»);

stage.show();
}
}

В данном случае при растяжении окна приложения автоматически будут растягиваться второй и третий столбцы.

ColumnConstraints в GridPane и JavaFX

Строки

С помощью метода getRowConstraints() у объекта GridPane можно получить коллекцию определений строк в виде объекта
ObservableList<RowConstraints>. Определение строк в GridPane представляют класс javafx.scene.layout.RowConstraints.

Чтобы создать определение строки, можно использовать один из следующих конструкторов:

  • RowConstraints()

  • RowConstraints​(double height): создает строку с фиксированной высотоой

  • RowConstraints​(double minHeight, double prefHeight, double maxHeight): создает строку с фиксированными значениями
    минимальной, предпочтительной и максимальной высоты

  • RowConstraints​(double minHeight, double prefHeight, double maxHeight, Priority vgrow, VPos valignment, boolean fillHeight):
    создает строку с фиксированными значениями минимальной, предпочтительной и максимальной высоты, vgrow устанавливает параметры расширения строки,
    valignment устанавливает выравнивание по вертикали, а fillWidth при значении true задает растяжение элемента по всей высоте строки

Как и столбец, строка по умолчанию занимает столько места, сколько необходимо для вмещения ее содержимого:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Priority;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.RowConstraints;

public class Main extends Application{

public static void main(String[] args) {

Application.launch(args);
}

@Override
public void start(Stage stage) {

Label first = new Label(«First»);
Label second = new Label(«Second»);
Label third = new Label(«Third»);
Label sixth = new Label(«Sixth»);

GridPane root = new GridPane();
// определения столбцов
root.getColumnConstraints().add(new ColumnConstraints(80));
ColumnConstraints column2 = new ColumnConstraints(150, 150, Double.MAX_VALUE);
column2.setHgrow(Priority.ALWAYS);
root.getColumnConstraints().add(column2);
ColumnConstraints column3 = new ColumnConstraints(70, 70, Double.MAX_VALUE);
column3.setHgrow(Priority.ALWAYS);
root.getColumnConstraints().add(column3);

// определения строк
root.getRowConstraints().add(new RowConstraints(80));
root.getRowConstraints().add(new RowConstraints(80));

root.setGridLinesVisible(true);
root.add(first, 0, 0);
root.add(second, 1, 0);
root.add(third, 2, 0);
root.add(sixth, 2, 1);

Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);

stage.setTitle(«GridPane in JavaFX»);

stage.show();
}
}

RowConstraints в JavaFX и GridPane

Чтобы растянуть строки по всей ширине GridPane, нужно установить для них ограничение vgrow с помощью перечисления Priority и метода setVgrow():

Читайте также:  Растяжение мышцы шеи лечение

// определения строк
RowConstraints row1 = new RowConstraints(80, 80, Double.MAX_VALUE);
row1.setVgrow(Priority.ALWAYS);

RowConstraints row2 = new RowConstraints(80, 80, Double.MAX_VALUE);
row2.setVgrow(Priority.ALWAYS);

root.getRowConstraints().add(row1);
root.getRowConstraints().add(row2);

Распределение строк в GridPane в JavaFX

Пропорциональные размеры

Для столбцов с помощью метода setPercentWidth() можно установить, сколько процентов обзего пространства будет занимать данный
столбец. Аналогично для строк с помощью метода setPercentHeight() можно установить, какую долю пространства контейнера
бует занимать строка. То есть вместо фиксированных размеров использовать пропорциональные:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Priority;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.RowConstraints;

public class Main extends Application{

public static void main(String[] args) {

Application.launch(args);
}

@Override
public void start(Stage stage) {

Label first = new Label(«First»);
Label second = new Label(«Second»);
Label third = new Label(«Third»);
Label sixth = new Label(«Sixth»);

GridPane root = new GridPane();
// определения столбцов
ColumnConstraints column1 = new ColumnConstraints();
column1.setPercentWidth(30);
root.getColumnConstraints().add(column1);

ColumnConstraints column2 = new ColumnConstraints();
column2.setPercentWidth(40);
root.getColumnConstraints().add(column2);

ColumnConstraints column3 = new ColumnConstraints();
column3.setPercentWidth(30);
root.getColumnConstraints().add(column3);

// определения строк
RowConstraints row1 = new RowConstraints();
row1.setPercentHeight(55);
root.getRowConstraints().add(row1);

RowConstraints row2 = new RowConstraints();
row2.setPercentHeight(45);
root.getRowConstraints().add(row2);

root.setGridLinesVisible(true);
root.add(first, 0, 0);
root.add(second, 1, 0);
root.add(third, 2, 0);
root.add(sixth, 2, 1);

Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);

stage.setTitle(«GridPane in JavaFX»);

stage.show();
}
}

Пропорциональные размеры в GridPane и JavaFX

Но если совокупная сумма процентов окажется больше 100, например, есть 3 столбца, и для каждого из них установлена ширина в 50 процентов,
тогда каждый столбец будет занимать 1/3 пространства (50/(50+50+50)).

Позиционирование элементов

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

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.RowConstraints;

public class Main extends Application{

public static void main(String[] args) {

Application.launch(args);
}

@Override
public void start(Stage stage) {

Button first = new Button(«First»);
Button second = new Button(«Second»);
Button third = new Button(«Third»);
Button fourth = new Button(«Fourth»);

GridPane root = new GridPane();

ColumnConstraints column1 = new ColumnConstraints();
column1.setPercentWidth(50);
root.getColumnConstraints().add(column1);

ColumnConstraints column2 = new ColumnConstraints();
column2.setPercentWidth(50);
root.getColumnConstraints().add(column2);

RowConstraints row1 = new RowConstraints();
row1.setPercentHeight(50);
root.getRowConstraints().add(row1);

RowConstraints row2 = new RowConstraints();
row2.setPercentHeight(50);
root.getRowConstraints().add(row2);

root.setGridLinesVisible(true);
root.add(first, 0, 0);
root.add(second, 0, 1);
root.add(third, 1, 0);
root.add(fourth, 1, 1);

Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);

stage.setTitle(«GridPane in JavaFX»);

stage.show();
}
}

Позиционирование элементов в GridPane в JavaFX

Как мы видим, из скриншота, элементы позиционируются слева по горизонтали и по центру по вертикали. Но с помощью ряда статических методов GridPane можно настроить положение элемента:

  • static void setHalignment​(Node child, HPos value): устанавливает горизонтальное выравнивание для элемента child

  • static void setHgrow​(Node child, Priority value): устанавливает, как элемент child будет растягиваться по горизонтали

  • static void setMargin​(Node child, Insets value): устанавливает для элемента child отступы от границ контейнера

  • static void setValignment​(Node child, VPos value): устанавливает вертикальное выравнивание для элемента child

  • static void setVgrow​(Node child, Priority value): устанавливает, как элемент child будет растягиваться по вертикали

Применим эти методы:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.geometry.Insets;
import javafx.scene.layout.Priority;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.RowConstraints;

public class Main extends Application{

public static void main(String[] args) {

Application.launch(args);
}

@Override
public void start(Stage stage) {

Button first = new Button(«First»);
// расположем кнопку в нижнем правом углу
GridPane.setHalignment(first, HPos.RIGHT);
GridPane.setValignment(first, VPos.BOTTOM);

Button second = new Button(«Second»);

// растянем кнопку по горизонтали
second.setMaxWidth(Double.MAX_VALUE);
GridPane.setHgrow(second, Priority.ALWAYS);

Button third = new Button(«Third»);
// растянем кнопку по горизонтали и вертикали
third.setMaxWidth(Double.MAX_VALUE);
third.setMaxHeight(Double.MAX_VALUE);
GridPane.setHgrow(third, Priority.ALWAYS);
GridPane.setVgrow(third, Priority.ALWAYS);

Button fourth = new Button(«Fourth»);
// кнопка заполняет все пространство ячейки
fourth.setMaxWidth(Double.MAX_VALUE);
fourth.setMaxHeight(Double.MAX_VALUE);
GridPane.setHgrow(fourth, Priority.ALWAYS);
GridPane.setVgrow(fourth, Priority.ALWAYS);
// установим отступ в 10 единиц
GridPane.setMargin(fourth, new Insets(10));

GridPane root = new GridPane();

ColumnConstraints column1 = new ColumnConstraints();
column1.setPercentWidth(50);
root.getColumnConstraints().add(column1);

ColumnConstraints column2 = new ColumnConstraints();
column2.setPercentWidth(50);
root.getColumnConstraints().add(column2);

RowConstraints row1 = new RowConstraints();
row1.setPercentHeight(50);
root.getRowConstraints().add(row1);

RowConstraints row2 = new RowConstraints();
row2.setPercentHeight(50);
root.getRowConstraints().add(row2);

root.setGridLinesVisible(true);
root.add(first, 0, 0);
root.add(second, 0, 1);
root.add(third, 1, 0);
root.add(fourth, 1, 1);

Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);

stage.setTitle(«GridPane in JavaFX»);

stage.show();
}
}

Элементы в GridPane в JavaFX

Источник

В стандарт Java входит два пакета для создания оконного пользовательского интерфейса: awt и его надстройка swing. Компоненты swing имеют расширенные возможности по сравнению с аналогичными awt компонентами, поэтому упор будет сделан на них. Во-вторых, в отличие от awt компоненты swing не содержат платформо-зависимого кода. Так сказать являются облегченными (lightweight) компонентами.

контейнеры верхнего уровня

  • JApplet — главное окно апплета;
  • JFrame — окно приложения;
  • JDialog — диалог приложения.
  • JColorChooser — диалог выбора цвета;
  • JFileChooser — диалог выбора файлов и директорий;
  • FileDialog — диалог выбора файлов и директорий (awt компонент).

простые контейнеры

  • JPanel — простая панель для группировки элементов, включая вложенные панели;
  • JToolBar — панель инструментов (обычно это кнопки);
  • JScroolPane — панель прокрутки, позволяющая прокручивать содержимое дочернего элемента;
  • JDesktopPane — контейнер для создания виртуального рабочего стола или приложений на основе MDI (multiple-document interface);
  • JEditorPane, JTextPane — контейнеры для отображения сложного документа как HTML или RTF;
  • JTabbedPane — контейнер для управления закладками;
  • JSplitPane — контейнер, разделяющий два элемента и позволяющий пользователю изменять их размер.

элементы интерфейса

Следующие элементы управления могут использоваться и как контейнеры, так как наследуются от класса java.awt.Container.

  • JButton — кнопка;
  • JCheckBox — кнопка-флажок;
  • JComboBox — выпадающий список;
  • JLabel — метка, надпись;
  • JList — список;
  • JPasswordField — текстовое поле для скрытого ввода;
  • JProgressBar — компонент для отображения числа в некотором диапазоне;
  • JRadioButton — преключатели, радио-кнопки, обычно используется с
    компонентом ButtonGroup;
  • JSlider — компонент позволяющий выбрать значение из заданного диапазона;
  • JSpinner — компонент позволяющий выбрать значение из указанной последовательности;
  • JTable — таблица;
  • JTextField — однострочное текстовое поле;
  • JTextArea — многострочное текстовое поле;
  • JTree — дерево.

управление позиционированием и размерами

Для автоматического позиционирования и задания размеров дочерних элементов контейнерыиспользуют специальные объекты — компоновщики. Для ручного позиционирования надо установить пустой объект вызовом метода setLayout(null).

Читайте также:  Испытание стеклопластика на растяжение

Ниже приведен список стандартных компоновщиков:

  • BorderLayout — размещает элементы в один из пяти регионов, как было указано при добавлении элемента в контейнер:
    наверх, вниз, влево, вправо, в центр;
  • FlowLayout — размещает элементы по порядку в том же направлении, что и ориентация контейнера (слева на право по умолчанию)
    применяя один из пяти видов выравнивания, указанного при создании менеджера.
    Данный менеджер используется по умолчанию в большинстве контейнерах;
  • GridLayout — размещает элементы таблично. Колличество столбцов и строк указывается
    при создании менеджера. По умолчанию одна строка, а число столбцов равно числу элементов;
  • BoxLayout — размещает элементы по вертикали или по горизонтали. Обычно он используется не
    напрямую а через контейнерный класс Box, который имеет дополнительные возможности;
  • SpringLayout — это менеджер низкого уровня и был разработан для программ
    построителей форм;
  • GroupLayout — данный менеджер также был разработан для построителей форм.

события

Элементы интерфейса и контейнеры генерируют ряд событий, например:

  • ActionEvent — событие, определяемое компонентом, например нажатие кнопки;
  • ComponentEvent — генерируется, когда позиция, размер или видимость компонента изменяются;
  • ContainerEvent — генерируется при добавлении или удалении элемента из контейнера;
  • FocusEvent — генерируется при получении или потери фокуса ввода компонентом;
  • ItemEvent — событие выбора или отменены выбора элемента.
    Например, изменение состояния кнопки-флажка, выбор элемента меню или списка;
  • KeyEvent — событие ввода с клавиатуры;
  • MouseEvent — события мыши;
  • WindowEvent — события окна, как активация и свертывание.

Для обработки событий элемента в нем необходимо зарегистрировать объект обработчик
в числе слушателей. Делается это методами типа addxxxListener, например addMouseListener(). В качестве объектов обработчиков обычно выбирают контейнер, в котором содержится элемент.Обработка события осуществляется через соответствующий интерфейс, например:

  • ActionListener — интерфейс обработки события ActionEvent;
  • ItemListener — интерфейс обработки события ItemEvent;
  • KeyListener — интерфейс обработки события KeyEvent;
  • MouseListener — интерфейс обработки события MouseEvent, для нажатия/отжатия кнопок и входа/ухода курсора мыши с
    области компонента;
  • MouseMotionListener — интерфейс обработки события MouseEvent, для движение курсора мыши или перетаскивании мышью;
  • MouseWheelListener — интерфейс обработки события MouseEvent, для прокрутки
    колеса мыши.

Если весь интерфейс реализовывать не нужно, например, нужен только
один из методов, то можно воспользоваться адаптерами.

Первое оконное приложение с использованием Java Swing

Обычно оконное приложение состоит из одного и более окон и диалогов.
В отличие от простых контейнеров контейнеры верхнего уровня имеют более сложную внутреннюю структуру. Для них автоматически создается корневой контейнер — объект класса JRootPane, который можно получить методом getRootPane(). Внутри корневого создаются еще дваобъекта: слойный контейнер и объект представляющий окно как компонент.

В большинстве случаев в слойном контейнере используются первых два контейнера слоя. Первый для хранения большинства элементов управления окна, так сказать клиентская область окна. Для доступа к нему прямо из окна используется метод getContentPane, также его можно заменить любым другим контейнером методом setContentPane(). Второй контейнер слой используется для хранения меню, панелей инструментов и т.п. Например, панель меню, добавляемая к окну, методом setJMenuBar() сохраняется именно там.

Методом getGlassPane можно получить объект представляющий окно как компонент для обработки событий или рисования поверх всех других компонент.

Ниже приведен минимальный шаблон оконного приложения.
Классы MyPanel и MyComponent — пользовательские классы, которые будут реализованы в некоторыхследующих примерах для демонстрации возможностей swing. Вам остается просто скопировать со страницы код MyPanel/MyComponent в проект со шаблоном, подправить шаблон и запустить его.

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JFrame;
/**
* @author DarkRaha
*
*/
public class MyWin extends JFrame {

// серийный номер класса
private static final long serialVersionUID = 1L;

public MyWin() {
Container c = getContentPane(); // клиентская область окна
c.setLayout(new BorderLayout()); // выбираем компоновщик

// добавляем какие-нибудь дочерние элементы
//MyComponent child = new MyComponent();
MyPanel child= new MyPanel();
c.add(child);

// ——————————————-
// настройка окна
setTitle(«Example window»); // заголовок окна
// желательные размеры окна
setPreferredSize(new Dimension(640, 480));
// завершить приложение при закрытии окна
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack(); // устанавливаем желательные размеры
setVisible(true); // отображаем окно
}

// запуск оконного приложения
public static void main(String args[]) {
new MyWin();
}
}

Ниже приведен более сложный пример с несколькими дочерними элементами и обработкой
событий.

// пример оконного приложения
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
* @author DarkRaha
*
*/
public class MainWin extends JFrame implements ActionListener {
// версия класса
private static final long serialVersionUID = 1L;

// некоторые элементы окна
private JTextArea jta = new JTextArea(
«Scroll bar will appear, when much text»);

public MainWin() {
// ——————————————
// добавление и настройка компонент
Container c = getContentPane(); // клиентская область окна
c.setLayout(new BorderLayout()); // выбираем компоновщик

// метку наверх
c.add(new JLabel(«my first label :)»), BorderLayout.NORTH);
// две кнопки в дополнительную панель
JPanel jp = new JPanel();
JButton jbt = new JButton(«Add text»);
jbt.addActionListener(this); // назначаем обработчик события
jp.add(jbt);
jbt = new JButton(«Clear text»);
jbt.addActionListener(this); // назначаем обработчик события
jp.add(jbt);
// добавляем панель вниз
c.add(jp, BorderLayout.SOUTH);
// помещаем текст. поле в область прокрутки
// а область прокрутки в центр окна,
// BorderLayout.CENTER значение по умолчанию
c.add(new JScrollPane(jta));
jta.setLineWrap(true); // автоматический перенос строк
// всплывающая подсказка
jta.setToolTipText(«this is simple text editor»);

// ——————————————-
// настройка окна

}

// обработчик события, метод интерфейса ActionListener
public void actionPerformed(ActionEvent arg0) {
if (arg0.getActionCommand().equals(«Add text»))
jta.append(» Add text\n»);

if (arg0.getActionCommand().equals(«Clear text»))
jta.setText(«»);

// если ссылки на объекты сохранены можно сравнивать
// по объектам, например для JButton jbOK= new JBUtton(«Ok»);
// то сравнение будет таким
// if(arg0.getSource().equals(jbOK))
}

// запуск оконного приложения
public static void main(String args[]) {
new MainWin();
}

}

Компоновщики

Менеджеры компоновки используются для автоматического позиционирования и задания размеров дочерних элементов в контейнере. Компоновщиком является любой объект реализующий интерфейс 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

Класс Box реализует контейнер с компоновщиком BoxLayout. Если элементы размещаются по горизонтали, то высота всех элементов равна высоте самого высокого элемента.А ширина элементов такова, чтобы заполнить весь контейнер по ширине.
При изменении ширины контейнера элементы растягиваются пропорционально. Если у всех элементов достигнут предел растяжения (значение getMaximumSize()), то первый элемент растягивается насильно. Если остается хотя бы один элемент доступный для растяжения, то растягивается только он.

Подобным образом происходит и вертикальное размещение. Ширина всех элементов равна ширине самого широкого элемента, а высота элеметов такова, чтобы заполнить весь контейнер по высоте. При этом может понадобится явное задание выравнивания элементов методом setAlignmentX. Иначе даже при одинаковой ширине, элементы не будут выстроены в красивый столбик.

Класс Box имеет статические методы для создания невидимых элементов для различных целей:

  • createHorizontalStrut(int width) — создает компонент с фиксированной шириной. При горизонтальной укладке элемент используется чтобы освободить пространство между соседними элементами, иначе элементы будут впритык. При вертикальной укладке элемент используется для задания минимальной ширины остальных элементов;
  • createVerticalStrut(int height) — создает компонент с фиксированной высотой. При вертикальной укладке элемент используется чтобы освободить пространство между соседними элементами, иначе элементы будут впритык. При горизонтальной укладке элемент используется для задания минимальной высоты остальных элементов;
  • createRigidArea(Dimension d) — создает невидимый элемент фиксированного размера;
  • createGlue() — создает невидимый растягиваемый компонент. Используется, чтобы предотвратить насильное растяжение элементов. Например, пусть в контейнере видимые элементы фиксированного размера. Тогда положив данный компонент в начало и в конец контейнера, мы получим центрирование видимых элементов. А если расположить его после каждого видимого, то при увеличении размера контейнера, видимые элементы «разойдутся» друг от друга.

пример использования компоновщиков

Ниже приведен пример использования некоторых компоновщиков. Цветные бордюры служат для разграничения текстовых полей друг от друга, если вызовы метода createVerticalStrut буду закомментированы.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
private String items[] = new String[] { «item1», «item2»,
«item3», «item4», «item5» };

public MyPanel() {
setLayout(new BorderLayout()); // выбираем компоновщик

// сеточная растановка в два столбца
// много строк
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(0, 2));
JButton jb;
JComboBox cb = new JComboBox(items);
jp.add(cb);
jb = new JButton(«bt1»);
jp.add(jb);
jb = new JButton(«bt2»);
jp.add(jb);
jb = new JButton(«bt3»);
jp.add(jb);
jb = new JButton(«bt4»);
jp.add(jb);

// укладываем элементы в ящик
Box bv = new Box(BoxLayout.Y_AXIS);
// минимальная ширина текстовых полей
bv.add(Box.createHorizontalStrut(60));

JTextArea jta = new JTextArea();
// рамка вокруг текстового поля
jta.setBorder(BorderFactory.createLineBorder(Color.green));
bv.add(jta);
// пустое место в 15 пикселей
bv.add(Box.createVerticalStrut(15));
// для эксперемента с размерами
// jta.setPreferredSize(new Dimension(60,100));
// jta.setMaximumSize(new Dimension(60,100));
// jta.setAlignmentX(LEFT_ALIGNMENT); // явно задаем выравнивание

jta = new JTextArea();
jta.setBorder(BorderFactory.createLineBorder(Color.green));
bv.add(jta);
bv.add(Box.createVerticalStrut(15));

jta = new JTextArea();
jta.setBorder(BorderFactory.createLineBorder(Color.green));
bv.add(jta);
bv.add(Box.createVerticalStrut(15));

add(jp); // добавляем панель в центр
add(bv, BorderLayout.WEST); // добавляем ящик влево
}
}

Источник