9
February

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

Posted in: Java GUI, Swing, AWT, SWT, Java technologies, J2SE |

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

Для группировки компонент интерфейса используются контейнеры (Container). Чаще всего используется контейнер JFrame (есть еще JWindows и JApplet). Методы, которые могут понадобиться:
setBounds(x, y, w, h) - указывает координаты верхней левой вершины окна, а также его ширину и высоту.
setResizable(bool) - указывает, можно ли изменять размер окна.
setTitle(str) - устанавливает название окна.
setVisible(bool) - отображает окно.
setDefaultCloseOperation(operation) - указывает операцию, которая будет произведена при закрытии окна.
Основные элементы управления: JLabel - элемент для отображения фиксированного текста; JTextField - простой edit-box; JButton - кнопка; JCheckBox - элемент выбора; JRadioButton - радио кнопка.
Как видите, все довольно просто и логично.
При отображении элементов управления используются специальные менеджеры - 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 pressedn“;
			message += “Text is “ + input.getText() + “n“;
			message += (radio1.isSelected()?“Radio #1“:“Radio #2“) + “ is selectedn“;
			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, скажите об этом, и в скором времени я напишу еще одну статью с более сложными приемами и компонентами.

7 Comments »

RSS feed for comments on this post. TrackBack URI



Apollo220
June 22, 2006 #

Сайт - хорош. Все тут приятно глазу и довольно познавательно. Учитывая, что я в яве… не эксперт.

Так вот скопировал я этот код… и чего делать?
как его запустить то???
Не работает у меня… :(

June 22, 2006 #

Во-первых, нужно установить JDK (я использую 1.4.2, но нужно на 1.5 переходить, а то глядишь уже и 1.6 на носу).
Во-вторых, поставь себе какую-нибудь IDE: Eclipse или Idea. Там довольно просто можно все запустить.
Если нет возможности ставить среду, пропиши системны переменные JAVA_HOME и CLASSPATH (об этом где угодно прочитать можно). Затем нужно скомпилировать код (пиши в командной строке):
javac SimpleGUI.java
и запустить:
java SimpleGUI.
Вот и все.
Если будут еще вопросы, пиши на e-mail - быстрее отвечу.

Sam
February 7, 2007 #

1. Копируем код, и сохраняем его в файл d:\SimpleGUI.java (имя файла должно посимвольно, с учетом регистра совпадать с именем класса!)

2. В консоли

d:
cd d:\
D:\>"c:\Program Files\Java\jdk1.5.0_04\bin\javac.exe" SimpleGUI.java

Если появится ошибка типа, illegal character: \8220 - замените в файле d:\SimpleGUI.java все символы на обычные двойные кавычки. И снова:


D:\>"c:\Program Files\Java\jdk1.5.0_04\bin\javac.exe" SimpleGUI.java

После чего должны появиться файлы
SimpleGUI.class
SimpleGUI$ButtonEventListener.class

3. Запускаем приложение

D:\>"c:\Program Files\Java\jdk1.5.0_04\bin\java.exe" SimpleGUI

Обратите внимание, что для запуска используется java.exe, а не javac.exe!

Наслаждайтесь!

Sam
February 7, 2007 #

Если появится ошибка типа, illegal character: \8220 - замените в файле d:\SimpleGUI.java все символы [косая двойная кавычка] на обычные двойные кавычки. И снова:

RobinGood
April 29, 2007 #

Спасибо за статью!:) И рас уж сейчас речь зашла об интерфейсе, буду признателен если кто-нибудь подскажет или скажем, направит на чьи-либо исходники. Вообщем хочу создат инетерфейс с нуля. Скажем у меня есть картинка на бэк-граунд, и картинки на менюшку. Все нарезано. Раньше делать такое не пробовал, потому столкнулся с рядом сложностей. Первая проблемака наверно довольно легка, но что то пока сам не решил. Как управлять слоями?. Мой бэк-граунд все закрывает. А вторая просьба^_^, если кто-нибудь знает как придать менюшке уникальный стиль, я не имею ввиду просто махнуть заливку.
Заранее спасибо. Ниже прикладываю код с первой проблемкой, т.е проблема со слоями. Менюшки там еще нет.

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.awt.*;

public class HelpCenter extends javax.swing.JFrame {

public HelpCenter () {
initComponents();
}

public Image ImageICO(){
try {
// Read from a file
File file = new File(”F:\\KGA\\ExpertSystem\\image\\ob_back.gif”);
image = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
return image;
}

private void initComponents() {
//Init FORM
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1 = new javax.swing.JLabel();
jLabel1.setIcon(new javax.swing.ImageIcon(ImageICO()));
getContentPane().add(jLabel1, java.awt.BorderLayout.CENTER);
pack();

jLabel2=new javax.swing.JLabel();
jLabel2.setText(”Foreign Cat!!!”);
getContentPane().add(jLabel2);

}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new HelpCenter().setVisible(true);
}
});
}
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private Graphics g;
private java.awt.Image image;
}

May 6, 2007 #

2 RobinGood: Посмотри следующую ссылку: JFrame (API)
Тебе нужно использовать glassPane. На ней ты и сможешь добавлять слоями компоненты.

Morfeus
May 5, 2008 #

Код не працює.. 50 помилок викидує.. ви трошки дивіться що на сайт викладаєте. я поки повиправляв півгодини часу вбив.. программери…

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>