Тема: Програмування подій при створенні інтерфейсу користувача в програмах на мові Java
Натиснення кнопки, закриття вікна, клацання мишкою – все це є прикладами подій, які отримує операційна система і передає відповідній програмі на обробку. Програміст повинен передбачити як потрібно обробляти дані події. Розглянемо як обробка подій реалізовується в Java.
В Java запропонована, так звана, модель делегування подій (event delegation model). Джерело події (event source) породжує подію, після чого вона передається в обробник подій (event listener – дослівно слухач події). При цьому будь-який об’єкт може бути призначеним як обробник деякої події. Така модель доволі гнучка, оскільки кожен програміст може вибрати зручний для нього спосіб обробки події (де саме її обробляти), проте інколи текст програми може бути дещо заплутаним для тих хто не звик до такої моделі.
Інформація про подію інкапсулюється у об’єкті події (event object). Всі події описуються підкласами java.util.EventObject. Як приклади, можна навести підкласи ActionEvent та WindowEvent. Перші об’єкти породжують кнопки, а другі вікна.
Джерела подій містять методи, які дозволяють зв’язати його з обробниками подій. Коли виникає подія, джерело повідомляє про неї усіх зареєстрованих обробників. Обробники подій на основі інформації у об’єкті події визначає як реагувати на ту чи іншу подію.
При розробці графічного інтерфейсу розробнику необхідного здійснити наступне:
Сказане демонструє наступний фрагмент програми:
ActionListener listener = . . .; // створити обробник подій
JButton button = new JButton("Ok"); // створюємо кнопку
button.addActionListener(listener); // зв'язуємо кнопку з обробником подій
Клас, який реалізовуватиме інтерфейс ActionListener повинен мати метод actionPerformed() який в якості параметру отримуватиме об’єкт ActionEvent.
class MyListener implements ActionListener
{
. . .
public void actionPerformed(ActionEvent event)
{
// тут відбувається реакція на натиснення кнопки
. . .
}
}
Реалізувати такий механізм можна декількома способами.
Розглянемо приклад:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.*;
import javax.swing.JOptionPane;
public class EventTest {
public static void main(String[] args) {
SimpleFrame frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class SimpleFrame extends JFrame
{
public SimpleFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // задаємо розміри фрейму
JPanel panel = new JPanel(); // створюємо панель
this.add(panel); // додаємо панель у фрейм
JButton button = new JButton("OK!"); //створюємо кнопку ОК!
panel.add(button); // додаємо кнопку на панель
EventListener buttonAction = new EventListener(); // створюємо екземпляр обробника подій
button.addActionListener(buttonAction); // зв'язуємо обробника подій з кнопкою "ОК!"
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}
class EventListener implements ActionListener{
@Override // не обов'язково; вказуємо, що ми перевизначаємо метод actionPerformed
public void actionPerformed(ActionEvent event)
{
// Виводимо повідомлення у діалоговому вікні
// зверніть увагу, що для цього ми створюємо новий фрейм
JOptionPane.showMessageDialog(new JFrame(), "Ви натиснули кнопку <<OK!>>");
}
}
Можна також зробити, що один і той же обробник буде обслуговувати декілька кнопок. В такому разі необхідно передбачити механізм розрізнення, яка кнопка натиснута. Найпростіше це зробити через конструктор обробника. Наступна програма виводитиме в фреймі дві кнопки і при нажатті на якусь з них буде виводитись повідомлення, яку кнопку натиснуто.
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.*;
import javax.swing.JOptionPane;
public class EventTest2 {
public static void main(String[] args) {
SimpleFrame frame = new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class SimpleFrame extends JFrame
{
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
public SimpleFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // задаємо розміри фрейму
JPanel panel = new JPanel(); // створюємо панель
this.add(panel); // додаємо панель у фрейм
JButton button1 = new JButton("Кнопка 1"); //створюємо кнопку 1
panel.add(button1); // додаємо кнопку на панель
EventListener button1Action = new EventListener(1); // створюємо екземпляр обробника подій
button1.addActionListener(button1Action); // зв'язуємо обробника подій з кнопкою 1
JButton button2 = new JButton("Кнопка 2"); //створюємо кнопку 2
panel.add(button2); // додаємо кнопку на панель
EventListener button2Action = new EventListener(2); // створюємо екземпляр обробника подій
button2.addActionListener(button2Action); // зв'язуємо обробника подій з кнопкою 2
}
}
class EventListener implements ActionListener{
private int buttonNumber;
public EventListener (int number){
buttonNumber=number;
}
@Override // не обов'язково, вказуємо, що ми перевизначаємо метод actionPerformed
public void actionPerformed(ActionEvent event)
{
// Виводимо повідомлення у діалоговому вікні, яку кнопку натиснуто
if (buttonNumber==1) JOptionPane.showMessageDialog(new JFrame(), "Ви натиснули кнопку 1");
else JOptionPane.showMessageDialog(new JFrame(), "Ви натиснули кнопку 2");
}
}
3. Завдання
Перевірити роботу програм наведених у загальній частині. Оформити та здати звіт.