Создаем оконное приложение java

Java. Swing. Основы

Следующие элементы управления могут использоваться и как контейнеры, так как наследуются от класса 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(). Внутри корневого создаются еще дваобъекта: слойный контейнер и объект представляющий окно как компонент.

Читайте также:  Service delegate in java

В большинстве случаев в слойном контейнере используются первых два контейнера слоя. Первый для хранения большинства элементов управления окна, так сказать клиентская область окна. Для доступа к нему прямо из окна используется метод 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); // добавляем ящик влево >>

Источник

Оцените статью