Іноді з'являється необхідність зробити певні дії щодо натискання клавіш у полі 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 з ім'ям 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 } } } } }
Так виглядає робота програми