Javenue logo

Javenue

Программирование на Java

Информационные технологии

Графический интерфейс на Java Swing - GUI Tutorial

В Java есть 2 основных пакета для создания графических интерфейсов (Graphics User Interface). Это Abstract Windows Toolkit (AWT) и Swing. AWT использует виджеты операционной системы, поэтому эта библиотека немного быстрее. Но на мой взгляд, Swing более хорошо спроектирован.

В данном туториале мы рассмотрим основные элементы библиотеки Swing и создадим простой интерфейс (GUI) в качестве примера.

Для группировки компонент интерфейса используются контейнеры (Container). Для создания основного контейнера для приложения чаще всего используется контейнер JFrame (есть еще JWindows и JApplet). Проще всего унаследоваться от JFrame тем самым получить доступ ко множеству методов, например:

setBounds(x, y, w, h) - указывает координаты верхней левой вершины окна, а также его ширину и высоту.

setResizable(bool) - указывает, можно ли изменять размер окна.

setTitle(str) - устанавливает название окна.

setVisible(bool) - собственно отображает окно.

setDefaultCloseOperation(operation) - указывает операцию, которая будет произведена при закрытии окна.

Основные элементы управления:

  • JLabel - элемент для отображения фиксированного текста;
  • JTextField - простой edit-box;
  • JButton - обычная кнопка (button);
  • JCheckBox - элемент выбора (аналог checkbox);
  • JRadioButton - радио кнопка

Как видите, все довольно просто и логично.

При отображении элементов управления используются специальные менеджеры - LayoutManager. У всех LayoutManager'ов есть методы для добавления у удаления элементов.

FlowLayout - используется для последовательного отображения элементов. Если элемент не помещается в конкретную строку, он отображается в следующей.

GridLayout - отображения элементов в виде таблицы с одинаковыми размерами ячеек.

BorderLayout - используется при отображении не более 5 элементов. Эти элементы располагаются по краям фрейма и в ценрте: North, South, East, West, Center.

BoxLayout - отображает элементы в виде рядка или колонки.

GridBagLayout - позволяет назначать месторасположение и размер каждого виджета. Это самый сложный, но и самый эффективный вид отображения.

Стоит еще обратить внимание на обработку событий. Для этого используются так называемые Event Listeners.

Ну все, довольно теории, перейдем к примеру GUI:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SimpleGUI extends JFrame {
	private JButton button = new JButton("Press");
	private JTextField input = new JTextField("", 5);
	private JLabel label = new JLabel("Input:");
	private JRadioButton radio1 = new JRadioButton("Select this");
	private JRadioButton radio2 = new JRadioButton("Select that");
	private JCheckBox check = new JCheckBox("Check", false);
	
	public SimpleGUI() {
	    super("Simple Example");
	    this.setBounds(100,100,250,100);
	    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	    Container container = this.getContentPane();
	    container.setLayout(new GridLayout(3,2,2,2));
	    container.add(label);
	    container.add(input);

	    ButtonGroup group = new ButtonGroup();
	    group.add(radio1);
	    group.add(radio2);
	    container.add(radio1);

	    radio1.setSelected(true);
	    container.add(radio2);
	    container.add(check);
	    button.addActionListener(new ButtonEventListener());
	    container.add(button);
	}
	
	class ButtonEventListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			String message = "";
			message += "Button was pressed\n";
			message += "Text is " + input.getText() + "\n";
			message += (radio1.isSelected()?"Radio #1":"Radio #2") 
                                + " is selected\n"; 
			message += "CheckBox is " + ((check.isSelected())
                                ?"checked":"unchecked"); 
			JOptionPane.showMessageDialog(null,
		    		message,
		    		"Output",
		    	    JOptionPane.PLAIN_MESSAGE);
		}
	}

	public static void main(String[] args) {
		SimpleGUI app = new SimpleGUI();
		app.setVisible(true);
	}
}

Примечания:

getContentPane возвращает контейнер верхнего уровня. ButtonGroup служит для создания группы взаимосвязанных радио-кнопок.

Внутренний класс ButtonActionListener реализует интерфейс ActionListener. Для этого необходимо предоставить имплементацию метода actionPerformed.

JOptionPane служит для отображения диалоговых окон.

Жду ваших вопросов и комментариев. Если вы хотите больше узнать о Swing, скажите об этом, и в скором времени я напишу еще одну статью с более сложными приемами и компонентами.



Комментариев: 4

  Выйти

  * для публикации комментариев нужно  

Алексей Семенихин:

Здравствуйте! Есть пара вопросов. 1.Почему переменным класса SimpleGUI присвоены атрибуты private? Работает, вроде, и без него. 2.Раз уж мы засунули все "приготовления" окна внутрь конструктора (.setBounds, .setDefaulCloseOperation), то почему .setVisible вынесене в psvm?

Зеновій Буричко:

Алексей , потому что программа начинает выполняться именно с метода psvm с других методов не может выполняться

Артём Скок:

Все бы ничего, но вот код не компилируется. Выдаёт ошибку: Exception in thread "main" java.lang.Error: Unresolved compilation problem: at simpleGUI.SimpleGUI.main(SimpleGUI.java:51) А так как я не силён в программировании прошу помочь.

Lacky YT:

Контейнер не нужно добавлять?у меня ничего не отображаеться