Теперь такой элемент графического интерфейса пользователя (GUI), как кнопка JButton из библиотеки визуальных компонентов Swing в Java, при удержании нажатой запускает многократное повторение того же действия, что и при однократном клике на ней. Уже готовый класс-наследник от JButton можно включить в свой Java-проект и просто использовать.
В реализованных на Java программах кнопка JButton из библиотеки визуальных компонентов Swing — наиболее часто используемый элемент графического интерфейса пользователя (в литературе GUI — Graphical User Interface): при клике или нажатии на ней мышкой однократно выполняется какое-то действие. Нередко бывает необходимым, чтобы удержание нажатой кнопки JButton запускало многократное повторение такого действия, подобно тому, как действует кнопка на клавиатуре компьютера.
Новый функционал кнопки реализует новый класс jButton — наследник класса JButton:
public class jButton extends JButtonПараметры, передаваемые в конструктор класса jButton, задают текст надписи на кнопке (как в конструкторе public JButton(String text) класса JButton), обработчик нажатия на кнопку, реализующий требуемое действие, задержку от нажатия на кнопку до запуска многократного повторения того же действия с периодичностью, задаваемой последним параметром, передаваемым в конструктор:
public jButton( String text, // надпись на кнопкеЗадержка delay и периодичность повторения period указываются в миллисекундах.
Обработчик нажатия на кнопку listener — это ссылка на экземпляр класса, реализующего интерфейс ActionListener. Поэтому в этом классе должен быть определён метод actionPerformed, в котором следует реализовать действия, выполняемые при нажатии мышкой на кнопку, например:
public class execOnPressed implements ActionListenerТеперь, при добавлении кнопки jButton в графический интерфейс пользователя, в конструктор класса jButton в качестве параметра следует передать ссылку на экземпляр класса execOnPressed, например:
add( new jButton(«Button», new execOnPressed(), 600, 100) );В результате появится кнопка с надписью «Button», по виду аналогичная кнопке типа JButton. При нажатии мышкой на такую кнопку действия, определённые в методе actionPerformed класса execOnPressed, сначала будут выполнены однократно, но, при удержании кнопки нажатой, через 0.6 секунды начнут выполняться повторно с периодичностью 0.1 секунды.
Приведенной выше информации вполне достаточно, чтобы начать использовать в своих программах класс jButton, реализующий повторение действия при удержании кнопки нажатой. Для этого надо лишь включить файл jButton.java с исходным текстом реализации класса jButton в свой Java-проект.
Рассмотрим подробнее реализацию класса jButton:
1 package myButtonRepeating;
2
3 import java.awt.event.*;
4 import javax.swing.*;
5
6 public class jButton extends JButton
7 {
8 protected ActionListener actionHandler;
9 protected Timer repeaTimer;
10
11 protected class repeaTimerListener implements ActionListener
12 {
13 public void actionPerformed( ActionEvent event )
14 {
15 if( actionHandler != null ) actionHandler.actionPerformed( null );
16 }
17 }
18
19 protected class MouseKeepTracker extends MouseAdapter
20 {
21 public void mousePressed( MouseEvent mouseEvent )
22 {
23 if( actionHandler != null ) actionHandler.actionPerformed( null );
24 repeaTimer.start();
25 }
26
27 public void mouseReleased( MouseEvent mouseEvent )
28 {
29 repeaTimer.stop();
30 }
31 }
32
33 public jButton( String text,
34 ActionListener listener,
35 int delay,
36 int period
37 )
38 {
39 super(text);
40 actionHandler = listener;
41
42 if( delay < 200 ) delay = 1000;
43 if( period < 20 ) period = 200;
44
45 repeaTimer = new Timer( delay, new repeaTimerListener() );
46 repeaTimer.setDelay( period );
47 addMouseListener( new MouseKeepTracker() );
48 }
49 }
Повторное выполнение закреплённого за кнопкой jButton действия – это результат повторного же вызова метода actionPerformed класса-обработчика нажатия на кнопку, ссылка на который была передана в конструктор класса jButton в качестве параметра listener и которая теперь хранится в поле actionHandler класса jButton (8 и 40). Для организации такого повторного вызова в конструкторе класса jButton создается экземпляр класса Timer из библиотеки визуальных компонентов Swing, ссылка на который теперь хранится в поле repeaTimer класса jButton. В конструктор класса Timer в качестве параметра передаётся ссылка на экземпляр класса repeaTimerListener, который также реализует интерфейс ActionListener и у которого также есть свой метод actionPerformed. Теперь этот метод вызывается для обработки событий таймера, иначе говоря, вызывается с заданной периодичностью. В этот метод вставлен вызов метода actionHandler.actionPerformed(…) с действиями, которые нужно выполнить при однократном нажатии на кнопку и которые нужно периодически повторять при удержании кнопки нажатой (9, 45 и 11-17).
Для фиксации моментов «нажатия» мышкой на кнопку и «отпускания» кнопки используются соответственно методы mousePressed и mouseReleased класса MouseKeepTracker, экземпляр которого также создаётся в конструкторе класса jButton и добавляется в качестве обработчика связанных с кнопкой событий мыши (19-31 и 47). При «нажатии» мышкой на кнопку в методе mousePressed сразу однократно вызывается метод actionHandler.actionPerformed(…) и требуемое по нажатии на кнопку действие выполняется однократно (23), затем
таймер запускается (24) и вызов метода actionHandler.actionPerformed(…) производит уже обработчик событий таймера. При «отпускании» кнопки таймер просто останавливается (29).
Созданный в Eclipse IDE проект с примером использования класса jButton см. в архивном файле myButtonRepeating.zip. В этом примере нажатие на кнопку увеличивает на единицу значение целочисленного счетчика counter, которое отображается рядом с кнопкой:
Ниже приведен исходный текст модуля с главным классом программы myButtonRepeater:
1 package myButtonRepeating;Здесь всё очень просто. В создаваемое окно приложения типа JFrame добавляются только два визуальных компонента – это текстовая метка, реализованная в классе JLabel и соответствующую ссылку на экземпляр которого хранит переменная label (10 и 27), и наша кнопка jButton (29). Обрабатывает нажатия на кнопку метод actionPerformed (15-19) класса execOnPressed (13-20), ссылка на экземпляр которого передаётся конструктору класса jButton в качестве второго параметра (29).
©Задорожный Сергей Михайлович, 2019г.