FocusListener — слушаем фокус компонента

Работа с приложением может осуществляться не только с помощью мыши, но и клавиатуры. Здесь важно понятие фокуса (focus). Для обработки событий фокуса при написании Java приложений необходимо использовать FocusListener. Думаю все знают, что такое фокус. Однако хотелось бы немного рассказать про то, как я понимаю понятие фокус. Фокус — это некий указатель, который говорит о том, какой сейчас компонент активен и может реагировать на клавиатуру. В фокусе может находиться только один компонент. Фокус, как правило отображается прямоугольником с тонкой линией (хотя это не всегда так) или пунктирным прямоугольником. Фокус возможно переключать, чтобы добраться до требуемого компонента. Как правило переключение фокуса производится при помощи кнопки Tab. Самый хороший пример работы фокуса, это несколько текстовых полей, в которые требуется ввести некие данные. Одновременно вводить мы не можем — это очевидно, значит должно быть что-то, что говорит, какой компонент сейчас активен и в него можно ввести данные с клавиатуры. Указатель, указывающий на поле, в которое мы в данный момент вводим данные и есть фокус. Фокус могут иметь не только текстовые поля. Его могут иметь, например и кнопки.

Иногда возникает необходимость произвести какие-то действия при получении фокуса компонентом или наоборот при его потере. Делается это всё при помощи слушателей. При получении фокуса компонентом и при его потере система генерирует событие, которое нужно отследить и отреагировать на него. Для реагирования на фокусные события есть специальный слушатель FocusListener. Интерфейс имеет два метода focusGained — вызывается системой при получении компонентом фокуса и focusLost — вызывается при потере фокуса компонентом. Всё предельно просто. Реализуем интерфейс, пишем нужный код в методы, а затем добавляем получившегося слушателя к нужному компоненту при помощи метода addFocusListener.

Тестовое приложение. Оно очень простое и содержит две кнопки. Как только кнопка "Button 2" получает или теряет фокус, и вызываются соответствующие методы слушаетля фокуса, это сразу же отображается текстовым сообщением ниже кнопок.

Внешний вид тестового приложения представлен на рисунке ниже.

focus_listener

Исходный код ниже.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TestFrame extends JFrame {

     private JLabel eventLabel;

     public TestFrame() {
          super("Test frame");

          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          JPanel mainPanel = new JPanel();
          mainPanel.setLayout(new BorderLayout());

          JPanel buttonsPanel = new JPanel();

          JButton button1 = new JButton("Button 1");
          button1.setPreferredSize(new Dimension(150, 80));
          buttonsPanel.add(button1);

          JButton button2 = new JButton("Button 2");
          button2.setPreferredSize(new Dimension(150, 80));
          buttonsPanel.add(button2);

          button2.addFocusListener(new CustomListener());

          mainPanel.add(buttonsPanel, BorderLayout.NORTH);

          eventLabel = new JLabel();
          eventLabel.setHorizontalAlignment(JLabel.CENTER);
          mainPanel.add(eventLabel, BorderLayout.CENTER);

          getContentPane().add(mainPanel);
     }

     public static JLabel createEmptyLabel() {
          JLabel label = new JLabel();
          label.setPreferredSize(new Dimension(100, 30));
          return label;
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    JFrame frame = new TestFrame();
                    frame.setPreferredSize(new Dimension(330, 160));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
               }
          });
     }

     public class CustomListener implements FocusListener {

          public void focusGained(FocusEvent e) {
               eventLabel.setText("Button 2 — focusGained()");
          }

          public void focusLost(FocusEvent e) {
               eventLabel.setText("Button 2 — focusLost()");
          }
     }
}

3 Responses to FocusListener — слушаем фокус компонента

  1. Tom:

    Метод createEmptyLabel лишний в данном контексте, т.к. нигде не вызывается.

  2. Zulin:

    Спасибо за статью. Написано доступно и быстро даёт необходимое исчерпывающее объяснение фокус лисенера.

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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