Иногда появляется необходимость совершить определенные действия по нажатию клавиш в поле TextField . Далее разберемся как можно обрабатывать события, которые поступают с клавиатуры.
Для начала создаем JTextField
JTextField textField = new JTextField();
помешаем его на панель или фрейм
panel.add(textField);
Теперь нужно добавить слушатель, который будет вызываться каждый раз при вводе данных в TextField. Роль слушателя выполняет интерфейс KeyListener из пакета java.awt.event.
Интерфейс KeyListener имеет 3 метода:
- void keyPressed (KeyEvent e);
Вызывается при нажатии пользователем на любую клавишу.
- void keyReleased (KeyEvent e);
Вызывается после того, как пользователь нажмет и отпустит любую клавишу.
- void keyTyped ( KeyEvent e);
Срабатывает каждый раз, когда пользователь вводит символы Unicode. Таблица символов Unicode
Добавить интерфейс слушателя можно двумя способами:
1) реализовать этот интерфейс и все его методы;
numberOfRouteTextField.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent event) { ... ... ... } public void keyReleased(KeyEvent event) { ... ... ... } public void keyTyped(KeyEvent event) { ... ... ... } });
2) расширить абстрактный класс KeyAdapter, переопределяя только необходимые методы.
numberOfRouteTextField.addKeyListener(new NumberKeyListener()); class NumberKeyListener extends KeyAdapter { public void keyReleased(KeyEvent e) { ... ... ... } }
Кроме того, мы можем сделать так, чтобы событие срабатывало при нажатии какой-то конкретной клавиши. Каждый символ, цифра, буква и клавиши управления на клавиатуре имеют свой код (код ключа). Добавляем проверку в любой из переопределенных методов. Например, тело метода будет выполняться только после нажатия пользователем клавиши Enter:
public void keyReleased(KeyEvent event) { if(event.getKeyCode() == KeyEvent.VK_ENTER ) { // тело метода } }
Далее пример небольшой реализации. Что я хочу получить ?
У меня имеется поле TextField c именем numberOfRouteTextField. Пользователь вводит количество путей. Затем, сразу после после ввода числа, появляется таблица с числом строк равным введенному числу.
import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; public class Routes { private JTextField numberOfRouteTextField; private DefaultTableModel tableModel; private Frame frame; private ArrayList<String[]> dataOfTableAboutRoutes; public static void main(String args[]) { Routes routes = new Routes(); routes.CreateGui(); } private void CreateGui() { frame = new JFrame("Построение таблицы маршрутов"); JLabel numberOfRoutesLabel; JPanel widgetPanel = new JPanel(); // создаем панель, где будут располагаться все элементы GridBagLayout gblWidgetPanel = new GridBagLayout(); // определяем менеджер компоновки GridBagConstraints constraints = new GridBagConstraints(); widgetPanel.setLayout(gblWidgetPanel); numberOfRoutesLabel = new JLabel("Количество маршрутов:"); constraints.gridwidth = 1; // сколько ячеек занимает объект constraints.gridy = 0; // какая по-счету ячейка по вертикали gblWidgetPanel.setConstraints(numberOfRoutesLabel, constraints); widgetPanel.add(numberOfRoutesLabel); numberOfRouteTextField = new JTextField(10); constraints.gridy = 1; numberOfRouteTextField.addKeyListener(new NumberKeyListener()); // добавляем слушателя к TextField gblWidgetPanel.setConstraints(numberOfRouteTextField, constraints); widgetPanel.add(numberOfRouteTextField); // размещаем на панели dataOfTableAboutRoutes = new ArrayList<>(); // здесь будет хранится все содержимое таблицы по строкам tableModel = new DefaultTableModel(); JTable writingRoutesTable = new JTable(tableModel); constraints.gridy = 2; // сколько ячеек занимает таблица gblWidgetPanel.setConstraints(writingRoutesTable, constraints); widgetPanel.add(writingRoutesTable); frame.add(BorderLayout.WEST,widgetPanel); frame.setSize(300, 300); frame.setVisible(true); } class NumberKeyListener extends KeyAdapter { // расширяем абстрактный класс KeyAdapter public void keyReleased(KeyEvent event) { // переопределяем необходимые методы // данный метод будет срабатывать после того, как пользователь введет любой символ с клавиатуры // в нашем случае неплохо было бы сделать проверку на вводимые данные, чтобы это были только целые числа if (event.getKeyCode() != KeyEvent.VK_BACK_SPACE) { // если пользователь нажал BackSpace с желанием стереть содержимое, то тело функции не будет выполняться String[] columnNames = new String[]{"Номер маршрута", "Начало", "Конец"}; // задаем заголовки таблицы int numberOfRoutes = Integer.parseInt(numberOfRouteTextField.getText()); // получаем число из TextField for (int i = 0; i < dataOfTableAboutRoutes.size(); i++) { tableModel.removeRow(0); // после удаления элементы смещаются,поэтому мы каждый раз удаляем первый элемент } dataOfTableAboutRoutes.clear(); // очищаем содержимое таблицы for (int i = 1; i <= numberOfRoutes; i++) { String[] temp = {"маршрут " + i, "",""}; dataOfTableAboutRoutes.add(temp); // заносим в таблицу число строк, равное заданному числу } tableModel.setColumnIdentifiers(columnNames); // устанавливаем в таблицу заголовки for (String[] dataOfTable : dataOfTableAboutRoutes) { tableModel.addRow(dataOfTable); // помещаем в таблицу содержимое из ArrayList } } } } }
Так выглядит работа программы