概要

JButtonがマウスで押されている間は指定したアクションを繰り返し実行するTimerを設定します。

サンプルコード

class AutoRepeatHandler extends MouseAdapter implements ActionListener {
  private final Timer autoRepeatTimer;
  private final BigInteger extent;
  private final JLabel view;
  private JButton arrowButton;

  public AutoRepeatHandler(int extent, JLabel view) {
    super();
    this.extent = BigInteger.valueOf(extent);
    this.view = view;
    autoRepeatTimer = new Timer(60, this);
    autoRepeatTimer.setInitialDelay(300);
  }
  @Override public void actionPerformed(ActionEvent e) {
    Object o = e.getSource();
    if (o instanceof Timer) {
      if (Objects.nonNull(arrowButton)
          && !arrowButton.getModel().isPressed()
          && autoRepeatTimer.isRunning()) {
        autoRepeatTimer.stop();
        arrowButton = null;
      }
    } else if (o instanceof JButton) {
      arrowButton = (JButton) e.getSource();
    }
    BigInteger i = new BigInteger(view.getText());
    view.setText(i.add(extent).toString());
  }
  @Override public void mousePressed(MouseEvent e) {
    if (SwingUtilities.isLeftMouseButton(e)
        && e.getComponent().isEnabled()) {
      autoRepeatTimer.start();
    }
  }
  @Override public void mouseReleased(MouseEvent e) {
    autoRepeatTimer.stop();
    arrowButton = null;
  }
  @Override public void mouseExited(MouseEvent e) {
    if (autoRepeatTimer.isRunning()) {
      autoRepeatTimer.stop();
    }
  }
}
view all

解説

上記のサンプルでは、JButtonにクリックで指定したJLabelの数値を増減するためのActionListenerと、自動リピートを行うTimerを起動するためのMouseListenerを設定しています。

  • JSpinnerで使用されているjavax.swing.plaf.basic.BasicSpinnerUI内のArrowButtonHandlerTimerのリピート間隔(60ms)や初回起動までの時間(300ms)は同じ値を設定

コメント