Java/Первое окно: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
восстановление после вандализма
Строка 1:
{{gui_nav}}
Каждое десктопное приложение должно иметь окно. В этом окне будут располагаться все необходимые компоненты графического интерфейса пользователя, посредством которых пользователь будет работать с приложением. Попробуем создать окно нашего приложения и разместить там что-нибудь. Пока что наше приложение будет простым и незамысловатым. Для создания окна приложения в Swing используется класс JFrame. Он содержит ряд методов и свойств, которые позволяют настроить его должным образом. Рассмотрим пример.
{{Java/Chapters}}
import java.awt.Dimension;
Так как в большинстве своем сегодняшние начинающие программисты не любят окно командной строки - приведу пример оконного приложения.
== Начнем с простого ==
<source lang="java">
import javax.swing.JFrame;
 
import javax.swing.JLabel;
public class MyWindowApp extends JFrame { //Наследуя от JFrame мы получаем всю функциональность окна
public class TestFrame {
 
public MyWindowApp(){
public static void createGUI() {
super("My First Window"); //Заголовок окна
JFrame.setDefaultLookAndFeelDecorated(true);
setBounds(100, 100, 200, 200); //Если не выставить
JFrame frame = new JFrame(«Test frame»);
//размер и положение
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//то окно будет мелкое и незаметное
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //это нужно для того чтобы при
JLabel label = new JLabel(«Test label»);
//закрытии окна закрывалась и программа,
frame.getContentPane().add(label);
//иначе она останется висеть в процессах
}
frame.setPreferredSize(new Dimension(200, 100));
 
public static void main(String[] args) { //эта функция может быть и в другом классе
frame.pack();
MyWindowApp app = new MyWindowApp(); //Создаем экземпляр нашего приложения
frame.setVisible(true);
app.setVisible(true); //С этого момента приложение запущено!
}
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createGUI();
}
});
}
}
</source>
simleswing
 
Это самое простое Swing приложение. Данный код создаст приложение, внешний вид которого представлен на рисунке. Рассмотрим код более детально. Каждое приложение должно содержать статический метод main – точка входа приложения, именно с него начинается выполнение.
Вот у нас и получилось ничего не делающее приложение!
Далее выполняется создание графического интерфейса пользователя. Создание графического интерфейса пользователя непременно должно происходить в Event dispatch потоке. Для этого метод вызывается внутри определенного вида конструкции SwingUtilities. Перейдем к непосредственному созданию и размещению компонентов.
 
Самой первой строкой метода createGUI мы говорим системе, чтобы окно полностью рисовалось Swing. Если закомментировать этот код, то окно будет определяться самой операционной системой – Swing доверит рисовать окно ей. Далее создаем само окно и указываем текст, который будет располагаться в его заголовке. С помощью метода setDefaultCloseOperation мы говорим системе, как отреагировать на закрытие окна. Сейчас нам необходимо, чтобы при закрытии окна закрывалось и приложение. Для этого мы передаем параметр JFrame.EXIT_ON_CLOSE. Но когда-нибудь необходимо будет не закрывать приложение, а закрыть только окно и оставить выполняться его в фоновом режиме, тогда мы будем передавать этому методу другой параметр.
== Делаем что-то полезное ==
Далее создаем текстовый лейбл с помощью JLabel, указывая при этом какой текст мы хотим в нем видеть, и размещаем на форме. При размещении компонента в окне тоже есть одна хитрость. У объекта JFrame есть специальная панель content pane, на которой должны размещаться все остальные дочерние компоненты. С помощью вызова getContentPane мы получаем эту панель и добавляем лейбл уже на нее. Далее устанавливаем размер окна и показываем его пользователю.
 
Это конечно замечательно уметь показывать пустое окно, но мы хотим, чтобы оно приносило пользу! Создадим форму для подсчета ворон на заборе. Для этого будем отображать текущее количество ворон и с помощью двух кнопок добавлять или вычитать по одной.
 
=== Дизайн ===
Это то, что мы примерно хотим увидеть:
{| border=1
|colspan=2 style="background:red"|<font color="white">Вороносчет</font>
|-
|colspan=2|'''Ворон на заборе : 666'''
|-
|Ворона прилетела
|Ворона улетела
|}
 
=== Скелет программы ===
Пишем программу:
 
<source lang="java">
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class VoronCalc extends JFrame {
private int voron = 0;
private JLabel countLabel;
private JButton addCrow;
private JButton removeCrow;
 
public VoronCalc(){
super("Crow calculator");
//Подготавливаем компоненты объекта
countLabel = new JLabel("Crows:" + voron);
addCrow = new JButton("Add Crow");
removeCrow = new JButton("Remove Crow");
 
//Подготавливаем временные компоненты
JPanel buttonsPanel = new JPanel(new FlowLayout());
//Расставляем компоненты по местам
add(countLabel, BorderLayout.NORTH); //О размещении компонент поговорим позже
 
buttonsPanel.add(addCrow);
buttonsPanel.add(removeCrow);
 
add(buttonsPanel, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
 
public static void main(String[] args) {
VoronCalc app = new VoronCalc();
app.setVisible(true);
app.pack(); //Эта команда подбирает оптимальный размер в зависимости от содержимого окна
}
}
</source>
 
После компиляции и запуска - получится что-то такое:
 
[[Файл:СrowCalc.png]]
<nowiki></nowiki>
 
=== Добавляем функциональность ===
 
Пришло время добавить немного интерактивности. Нам нужно сделать 3 вещи:
 
# Научить кнопку addCrow добавлять 1 к переменной voron.
# Научить кнопку removeCrow вычитать 1 из переменной voron.
# Научить countLabel - обновлять свое значение в зависимости от содержимого переменной voron.
 
==== addCrow ====
Добавляем [[Java/Listeners|listener]] для кнопки addCrow.
<source lang="java">
addCrow.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
voron = voron+1; //Добавляем одну ворону
updateCrowCounter(); //Сообщаем приложению, что количество ворон изменилось
}
});
</source>
 
==== removeCrow ====
Добавляем [[Java/Listeners|listener]] для кнопки removeCrow.
<source lang="java">
removeCrow.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if( voron > 0 ) {
voron = voron - 1;
updateCrowCounter(); //Сообщаем приложению, что количество ворон изменилось
}
}
});
</source>
 
==== updateCrowCounter ====
<source lang="java">
private void updateCrowCounter() {
countLabel.setText("Crows:" + voron);
}
</source>
 
=== Конечный результат ===
* [[Java/Первое окно/VoronCalc.java|VoronCalc.java]] - главный класс программы
 
{{BookCat}}
 
[[en:Java Programming/Events and Buttons]]
[[pt:Java/Swing/Eventos e Action listeners]]