Swing/AutoRepeatTimer のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/AutoRepeatTimer へ行く。
- category: swing folder: AutoRepeatTimer title: JButtonがマウスで押されている間、アクションを繰り返すTimerを設定する tags: [JButton, ActionListener, MouseListener, Timer] author: aterai pubdate: 2015-06-08T00:00:32+09:00 description: JButtonがマウスで押されている間は指定したアクションを繰り返し実行するTimerを設定します。 image:
概要
JButton
がマウスで押されている間は指定したアクションを繰り返し実行するTimer
を設定します。
Screenshot
Advertisement
サンプルコード
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 in GitHub: Java, Kotlin解説
上記のサンプルでは、JButton
にクリックで指定したJLabel
の数値を増減するためのActionListener
と、自動リピートを行うTimer
を起動するためのMouseListener
を設定しています。
JSpinner
で使用されているjavax.swing.plaf.basic.BasicSpinnerUI
内のArrowButtonHandler
とTimer
のリピート間隔(60ms
)や初回起動までの時間(300ms
)は同じ値を設定