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
Сайт - хорош. Все тут приятно глазу и довольно познавательно. Учитывая, что я в яве… не эксперт.
Так вот скопировал я этот код… и чего делать?
как его запустить то???
Не работает у меня… ![]()
Во-первых, нужно установить JDK (я использую 1.4.2, но нужно на 1.5 переходить, а то глядишь уже и 1.6 на носу).
Во-вторых, поставь себе какую-нибудь IDE: Eclipse или Idea. Там довольно просто можно все запустить.
Если нет возможности ставить среду, пропиши системны переменные JAVA_HOME и CLASSPATH (об этом где угодно прочитать можно). Затем нужно скомпилировать код (пиши в командной строке):
javac SimpleGUI.java
и запустить:
java SimpleGUI.
Вот и все.
Если будут еще вопросы, пиши на e-mail - быстрее отвечу.
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!
Наслаждайтесь!
Если появится ошибка типа, illegal character: \8220 - замените в файле d:\SimpleGUI.java все символы [косая двойная кавычка] на обычные двойные кавычки. И снова:
…
Спасибо за статью!:) И рас уж сейчас речь зашла об интерфейсе, буду признателен если кто-нибудь подскажет или скажем, направит на чьи-либо исходники. Вообщем хочу создат инетерфейс с нуля. Скажем у меня есть картинка на бэк-граунд, и картинки на менюшку. Все нарезано. Раньше делать такое не пробовал, потому столкнулся с рядом сложностей. Первая проблемака наверно довольно легка, но что то пока сам не решил. Как управлять слоями?. Мой бэк-граунд все закрывает. А вторая просьба^_^, если кто-нибудь знает как придать менюшке уникальный стиль, я не имею ввиду просто махнуть заливку.
Заранее спасибо. Ниже прикладываю код с первой проблемкой, т.е проблема со слоями. Менюшки там еще нет.
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;
}
2 RobinGood: Посмотри следующую ссылку: JFrame (API)
Тебе нужно использовать glassPane. На ней ты и сможешь добавлять слоями компоненты.
Код не працює.. 50 помилок викидує.. ви трошки дивіться що на сайт викладаєте. я поки повиправляв півгодини часу вбив.. программери…