Кнопка JButton: повторение действия при удержании нажатой

Пятница , 15, Февраль 2019 Leave a comment
Кнопка JButton: повторение действия при удержании нажатой

Теперь такой элемент графического интерфейса пользователя (GUI), как кнопка JButton из библиотеки визуальных компонентов Swing в Java, при удержании нажатой запускает многократное повторение того же действия, что и при однократном клике на ней. Уже готовый класс-наследник от JButton можно включить в свой Java-проект и просто использовать.

В реализованных на Java программах кнопка JButton из библиотеки визуальных компонентов Swing — наиболее часто используемый элемент графического интерфейса пользователя (в литературе GUIGraphical User Interface): при клике или нажатии на ней мышкой однократно выполняется какое-то действие. Нередко бывает необходимым, чтобы удержание нажатой кнопки JButton запускало многократное повторение такого действия, подобно тому, как действует кнопка на клавиатуре компьютера.

Новый функционал кнопки реализует новый класс jButton — наследник класса JButton:

public class jButton extends JButton
{
 …
}

Параметры, передаваемые в конструктор класса jButton, задают текст надписи на кнопке (как в конструкторе public JButton(String text) класса JButton), обработчик нажатия на кнопку, реализующий требуемое действие, задержку от нажатия на кнопку до запуска многократного повторения того же действия с периодичностью, задаваемой последним параметром, передаваемым в конструктор:

public jButton( String text,             // надпись на кнопке
                ActionListener listener, // обработчик
                int delay,               // задержка, мс
                int period               // периодичность повторения, мс
              )
{
 …
}

Задержка delay и периодичность повторения period указываются в миллисекундах.

Обработчик нажатия на кнопку listener — это ссылка на экземпляр класса, реализующего интерфейс ActionListener. Поэтому в этом классе должен быть определён метод actionPerformed, в котором следует реализовать действия, выполняемые при нажатии мышкой на кнопку, например:

public class execOnPressed implements ActionListener
{
 public void actionPerformed( ActionEvent event )
 {
  … // здесь то, что нужно выполнить при нажатии на кнопку
 }
}

Теперь, при добавлении кнопки 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, которое отображается рядом с кнопкой:

Кнопка JButton: повторение действия при удержании нажатой

Ниже приведен исходный текст модуля с главным классом программы myButtonRepeater:

 1   package myButtonRepeating;
 2 
 3   import java.awt.*;
 4   import java.awt.event.*;
 5 
 6   import javax.swing.*;
 7 
 8   public class myButtonRepeater extends JFrame
 9   {
10    protected JLabel label;
11    protected Integer counter;
12 
13    public class execOnPressed implements ActionListener
14    {
15     public void actionPerformed( ActionEvent event )
16     {
17      counter++;
18      label.setText( counter.toString() );
19     }
20    }
21 
22    public myButtonRepeater()
23    {
24     counter = new Integer( 0 );
25 
26     setLayout(new FlowLayout( FlowLayout.CENTER, 10, 10) );
27     add( label = new JLabel( counter.toString() ) );
28 
29     add( new jButton(«Button», new execOnPressed(), 600, 100) );
30 
31     setTitle(«myButtonRepeater testing!»);
32     setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
33     setMinimumSize(new Dimension(320, 72));
34     setLocation( new java.awt.Point( 320, 128 ) );
35     setResizable(false);
36     setVisible(true);
37    }
38 
39    public static void main( String[] args )
40    {
41     SwingUtilities.invokeLater
42     (
43      new Runnable()
44      {
45       public void run()
46       {
47        new myButtonRepeater();
48       }
49      }
50     );
51    }
52   }

Здесь всё очень просто. В создаваемое окно приложения типа JFrame добавляются только два визуальных компонента – это текстовая метка, реализованная в классе JLabel и соответствующую ссылку на экземпляр которого хранит переменная label (10 и 27), и наша кнопка jButton (29). Обрабатывает нажатия на кнопку метод actionPerformed (15-19) класса execOnPressed (13-20), ссылка на экземпляр которого передаётся конструктору класса jButton в качестве второго параметра (29).

  • Скачать файл jButton.java с исходным текстом реализации класса jButton
  • Скачать созданный в Eclipse IDE проект с примером использования класса jButton в архивном файле myButtonRepeating.zip

Please give us your valuable comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *