Focuslistener - слухаємо фокус компонента, java swing і інша джава

Робота з додатком може здійснюватися не тільки за допомогою миші, але і клавіатури. Тут важливо поняття фокуса (focus). Для обробки подій фокуса при написанні Java додатків необхідно використовувати FocusListener. Думаю всі знають, що таке фокус. Однак хотілося б трохи розповісти про те, як я розумію поняття фокус. Фокус - це якийсь покажчик, який говорить про те, який зараз компонент активний і може реагувати на клавіатуру. У фокусі може перебувати тільки один компонент. Фокус, як правило відображається прямокутником з тонкою лінією (хоча це не завжди так) або пунктирним прямокутником. Фокус можливо перемикати, щоб дістатися до необхідного компонента. Як правило перемикання фокусу проводиться за допомогою кнопки Tab. Самий хороший приклад роботи фокуса, це кілька текстових полів, в які потрібно ввести деякі дані. Одночасно вводити ми не можемо - це очевидно, значить має бути щось, що говорить, який компонент зараз активний і в нього можна ввести дані з клавіатури. Покажчик, який вказує на поле, в яке ми в даний момент вводимо дані і є фокус. Фокус можуть мати не тільки текстові поля. Його можуть мати, наприклад і кнопки.

Іноді виникає необхідність провести якісь дії при отриманні фокусу компонентом або навпаки при його втраті. Робиться це все за допомогою слухачів. При отриманні фокусу компонентом і при його втраті система генерує подія, яке потрібно відстежити і відреагувати на нього. Для реагування на фокусні події є спеціальний слухач FocusListener. Інтерфейс має два методи focusGained - викликається системою при отриманні компонентом фокуса і focusLost - викликається при втраті фокуса компонентом. Все гранично просто. Реалізуємо інтерфейс, пишемо потрібний код в методи, а потім додаємо отриманого слухача до потрібного компоненту за допомогою методу addFocusListener.

Тестове додаток. Воно дуже просте і містить дві кнопки. Як тільки кнопка "Button 2" отримує або втрачає фокус, і викликаються відповідні методи слушаетля фокуса, це відразу ж відображається текстовим повідомленням нижче кнопок.

Зовнішній вигляд тестового додатку представлений на малюнку нижче.

Focuslistener - слухаємо фокус компонента, java swing і інша джава

Вихідний код нижче.

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");

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);

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

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 ()");
>
>
>