KeyListener – обработка событий клавиатуры

Работая с приложением, которое имеет графический интерфейс, пользователь прибегает к помощи не только мыши, но и клавиатуры. Java Swing даёт возможность разработчику приложения обработать различные события, которые поступают от клавиатуры в то время, когда пользователь нажимает клавиши. Давайте посмотрим, что необходимо сделать, чтобы иметь возможность слушать события клавиатуры. Для этого рассмотрим интерфейс KeyListener из пакета java.awt.event.

Как в случае и с обработкой других событий, для обработки событий клавиатуры необходимо реализовать специальный интерфейс, а затем добавить получившегося слушателя к интересуемому компоненту. Интерфейс, который нужно реализовать для обработки клавиш был упомянут выше – это КeyListener из пакета java.awt.event. KeyListener имеет три метода: keyTyped, keyPressed и keyReleased.

Когда вызывается каждый из методов системой? Метод keyTyped вызывается системой каждый раз, когда пользователь нажимает на клавиатуре клавиши символы Unicode. Метод keyPressed вызывается системой в случае нажатия любой клавиши на клавиатуре. Метод keyReleased вызывается при отпускании любой клавиши на клавиатуре. Чтобы добавить слушателя KeyListener к интересуемому компоненту для прослушивания событий клавиатуры, используется метод addKeyListener. В качестве параметра методу передается ссылка на слушателя. Для удаления слушателя используется метод removeKeyListener.

Давайте посмотрим, как можно добавить слушателя KeyListener к компоненту в самом простейшем случае.

JTextField textField = new JTextField(20);
textField.addKeyListener(new KeyListener() {

	public void keyPressed(KeyEvent e) {

	}

	public void keyReleased(KeyEvent e) {
				
	}

	public void keyTyped(KeyEvent e) {
				
	}
	
});

Здесь создается текстовое поле JTextField. Затем при помощи метода addKeyListener добавляется анонимный слушатель, который реализует все методы интерфейса KeyListener.
Как правило не всегда нужно реализовывать все три метода интерфейса KeyListener. Однако если мы делаем implements KeyListener, то обязаны сделать реализацию каждого метода интерфейса, даже если они будут пустыми. На такой случай есть специальный абстрактный класс KeyAdapter, который содержит все три метода но с пустыми методами keyTyped, keyPressed и keyReleased. Тогда достаточно будет пронаследоваться от KeyAdapter и переопределить в нем только требуемый метод.

Если нет необходимости реализовывать все методы KeyListener, то можно сделать вот так:

textField.addKeyListener(new KeyAdapter() {
	
	public void keyPressed(KeyEvent e) {
		
	}
			
});

Каждый раз, когда пользователь нажимает клавиши на клавиатуре и система вызывает методы keyTyped, keyPressed и keyReleased, в качестве параметра им передается объект KeyEvent, который содержит всю необходимую информацию о произошедшем событии. Отсюда можно узнать код клавиши, которая была нажата – метод getKeyCode. Были ли зажаты при этом такие клавиши, как Alt, Shift или Ctrl. Проверить это можно вызвав соответственно методы isAltDown, isShiftDown и isControlDown. Класс KeyEvent содержит большой набор констант. Каждая константа содержит код соответствующей клавиши. Поэтому нет необходимости коды всех клавиш. Достаточно использовать какую-то из констант. По названиям констант можно легко определить, какой клавише она соответствует. Например KeyEvent. VK_ENTER или KeyEvent.VK_F.

Стоит сказать, что события от клавиатуры будут генерироваться системой только тогда, когда компонент, который мы слушаем, находится в фокусе.

Посмотрим теперь на тестовый пример.

Здесь происходит обработки нажатия клавиш компонентом JPanel. Вообще по умолчанию JPanel не должен получать фокуса, однако это можно зделать, если очень захотеть при помощи метода setFocusable и передать этому методу true в качестве параметра.

import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

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

public class TestFrame extends JFrame {
	
	private JLabel label;
	
	public TestFrame() {
		super("Test frame");
		createGUI();
	}

	public void createGUI() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel panel = new JPanel();
		panel.setLayout(new BorderLayout());
		panel.setFocusable(true);

		label = new JLabel();
		label.setFont(new Font("Calibri", Font.PLAIN, 20));
		label.setHorizontalAlignment(JLabel.CENTER);
		
		panel.addKeyListener(new KeyAdapter() {

			public void keyReleased(KeyEvent e) {
				label.setText(e.getKeyText(e.getKeyCode()));
			}
			
		});
		
		panel.add(label, BorderLayout.CENTER);
				
		setPreferredSize(new Dimension(200, 200));
		getContentPane().add(panel);
	}
	
	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame.setDefaultLookAndFeelDecorated(true);
				TestFrame frame = new TestFrame();
				frame.pack();
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
	}
}
Advertisements

8 Responses to KeyListener – обработка событий клавиатуры

  1. badmod says:

    Большое пребольшое спасибо!!!

  2. Неплохая статья для новичков, спасибо.

  3. На сколько я заметил кейЭвент обрабатывает только тот компонент который имеет фокус. если оный пропадает то оный больше не слушает события. А вот интересно как клобально зарегистрировать ключ ? ))

    • Paul says:

      наверное добавить лисенер на саму форму окна приложения, тогда событие будет обрабатываться во всех случаях, когда окно приложения активно.

    • Серик says:

      Нужно реализовать интерфейс KeyEventDispatcher, затем добавить реализацию в фокус менеджер
      KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new MyDispatcher()),
      где MyDispatcher — ваша реализация KeyEventDispatcher.

  4. Oleg S. Plesser says:

    А как разруливать ситуацию если на панель добавить какой либо еще компонент?
    Не ставить жевсем остальным виджет
    some_widget.setFocusable(false);

    спасибо

  5. Faust says:

    Спасибо, урок понравился

  6. Михаил says:

    Статья — огонь! Гигантское спасибо автору!!!

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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