Слушаем оконные события JFrame

JFrame в Java Swing при определенном взаимодействии с пользователем (свернуть, развернуть, открыть, закрыть) информирует систему о наступлении оконных Window событий. На самом деле я не знаю, как правильно назвать события, которые возникают, когда пользователь сворачивает, разворачивает, открывает и закрывает окно JFrame. Думаю, что по смыслу подходит название «оконные». Временами разработчику нужно каким-то образом реагировать на такие события. Как это сделать? Следуя философии Java Swing нам нужно отыскать интерфейс нужного слушателя listener’а, который может прослушивать события такого вида. Таким интерфейсом слушателя является WindowListener. Этот интерфейс расположен в пакете java.awt.event и имеет несколько методов. Методы рассмотрим чуть ниже. Далее мы должны реализовать этот интерфейс и полученного слушателя добавить к JFrame.

Рассмотрим методы, которые необходимо реализовать. Напомню, что реализовать мы должны все методы WindowListener, но никто не запрещает нам оставить реализации пустыми, ведь не всегда же нам нужно реагировать на всё происходящее. Совсем как в жизни, если на всё реагировать, то с ума можно сойти 🙂 Первый метод – это windowActivated. Данный метод у слушателя будет вызываться каждый раз, когда окно будет становиться активным. Например, у нас есть два окна – окно нашего приложения и другое. Если переключиться на окно другого приложения, а затем на наше – то непременно произойдет вызов метода windowActivated. Далее метод windowClosed. Метод интересный, потому что судя по документации вызываться он будет только если мы скажем JFrame сделать dispose, то есть очистить все нативные ресурсы. Для этого в JFrame есть специальный метод, который так и называется dispose. Если закрывать окно на крестик в правой части заголовка, то метод вызываться не будет. Тогда как же узнать, что пользователь всё-таки нажал на «Закрыть» у JFrame’а ? Как только кликаем крестик, вызывается метод windowClosing. Следующий метод в списке – это windowDeactivated. Думаю из названия этого метода понятно, что вызывается он в тот момент, когда окно нашего приложения перестает быть активным, то есть мы просто переключаемся на другое окно. При сворачивании и разворачивании окна приложения будут вызываться методы windowIconified и windowDeiconified соответственно. Ну и последний метод windowOpened. Вызывается у слушателя как только окно открывается, точнее после того как окно открылось.

Как только слушатель создан, можно приступить к его добавлению к JFrame. Делается это при помощи методы addWindowListener. В качестве параметра передается ссылка на экземпляр слушателя, реализующего WindowListener.

По традиции простой пример. Здесь мы создаем окно приложения JFrame и еще один класс, который реализует интерфейс WindowListener. Этот класс TestWindowListener далее используется для создания слушателя, который добавляется к JFrame. Все результаты работы приложения выводятся в консоль. Так очень легко можно проследить последовательность вызова методов у слушателя при срабатывании оконных событий. Внешний вид приложения и исходный код представлены ниже.

simple_jframe

import java.awt.Dimension;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;

public class TestFrame extends JFrame {

     public static void createGUI() {
          JFrame frame = new JFrame("Test frame");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          
          WindowListener winListener = new TestWindowListener();
          frame.addWindowListener(winListener);
                    
          frame.setPreferredSize(new Dimension(450, 200));
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    createGUI();
               }
          });
     }
     
     public static class TestWindowListener implements WindowListener {

          public void windowActivated(WindowEvent e) {
               System.out.println("windowActivated()");               
          }

          public void windowClosed(WindowEvent e) {
               System.out.println("windowClosed()");     
          }

          public void windowClosing(WindowEvent e) {
               System.out.println("windowClosing()");               
          }

          public void windowDeactivated(WindowEvent e) {
               System.out.println("windowDeactivated()");               
          }

          public void windowDeiconified(WindowEvent e) {
               System.out.println("windowDeiconified()");               
          }

          public void windowIconified(WindowEvent e) {
               System.out.println("windowIconified()");               
          }

          public void windowOpened(WindowEvent e) {
               System.out.println("windowOpened()");
          }
     }
}

Advertisements

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: