Програмування подій при створенні інтерфейсу користувача в програмах на мові Java

Про матеріал
В Java запропонована, так звана, модель делегування подій (event delegation model). Джерело події (event source) породжує подію, після чого вона передається в обробник подій (event listener – дослівно слухач події). При цьому будь-який об’єкт може бути призначеним як обробник деякої події.
Перегляд файлу

Тема: Програмування подій при створенні інтерфейсу користувача в програмах на мові Java

  1.               Мета роботи: Засвоїти методологію створення інтерфейса користувача в програмах на мові Java
  2.               Загальні відомості

Натиснення кнопки, закриття вікна, клацання мишкою – все це є прикладами подій, які отримує операційна система і передає відповідній програмі на обробку. Програміст повинен передбачити як потрібно обробляти дані події. Розглянемо як обробка подій реалізовується в Java.

В Java запропонована, так звана, модель делегування подій (event delegation model). Джерело події (event source) породжує подію, після чого вона передається в обробник подій (event listener – дослівно слухач події). При цьому будь-який об’єкт може бути призначеним як обробник деякої події. Така модель доволі гнучка, оскільки кожен програміст може вибрати зручний для нього спосіб обробки події (де саме її обробляти), проте інколи текст програми може бути дещо заплутаним для тих хто не звик до такої моделі.

Інформація про подію інкапсулюється у об’єкті події (event object). Всі події описуються підкласами java.util.EventObject. Як приклади, можна навести підкласи ActionEvent та WindowEvent. Перші об’єкти породжують кнопки, а другі вікна.

Джерела подій містять методи, які дозволяють зв’язати його з обробниками подій. Коли виникає подія, джерело повідомляє про неї усіх зареєстрованих обробників. Обробники подій на основі інформації у об’єкті події визначає як реагувати на ту чи іншу подію.

При розробці графічного інтерфейсу розробнику необхідного здійснити наступне:

  1. Створити клас, який оброблятиме подію чи ряд подій і, який реалізовуватиме відповідний інтерфейс
  2. Створити джерела подій (вікно, кнопки, смугу прокрутки тощо)
  3. Зв’язати джерела подій з обробниками подій

Сказане демонструє наступний фрагмент програми:

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. Завдання

 

Перевірити роботу програм наведених у загальній частині. Оформити та здати звіт.

docx
Додано
10 листопада 2023
Переглядів
151
Оцінка розробки
Відгуки відсутні
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку