Swing/ScrollTabsActionRepeater のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ScrollTabsActionRepeater へ行く。
- 1 (2022-08-29 (月) 01:38:06)
- 2 (2022-08-30 (火) 20:59:26)
- 3 (2024-05-12 (日) 21:35:42)
- 4 (2024-06-07 (金) 13:58:31)
- category: swing folder: ScrollTabsActionRepeater title: JTabbedPaneのタブスクロールボタンで連続スクロールを実行する tags: [JTabbedPane, JButton, Timer] author: aterai pubdate: 2022-08-29T01:37:17+09:00 description: JTabbedPaneのスクロールタブレイアウトで矢印ボタンを押下中はスクロールが持続するよう設定します。 image: https://drive.google.com/uc?id=1JZt4Veeacrr1cyQxiF5JOU7oX14k-aFx
概要
JTabbedPane
のスクロールタブレイアウトで矢印ボタンを押下中はスクロールが持続するよう設定します。
Screenshot
Advertisement
サンプルコード
class ActionRepeatHandler extends MouseAdapter implements ActionListener {
// BasicScrollBarUI scrollSpeedThrottle
private final static int scrollSpeedThrottle = 60; // delay in milli seconds
private final Timer timer;
private final Action action;
private JButton button;
protected ActionRepeatHandler(Action action) {
super();
this.action = action;
timer = new Timer(scrollSpeedThrottle, this);
timer.setInitialDelay(300);
}
@Override public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
if (o instanceof Timer && button != null) {
if (!button.getModel().isPressed() && timer.isRunning()) {
timer.stop();
button = null;
} else {
Component c = SwingUtilities.getAncestorOfClass(
JTabbedPane.class, button);
action.actionPerformed(new ActionEvent(c,
ActionEvent.ACTION_PERFORMED, null,
e.getWhen(), e.getModifiers()));
}
}
}
@Override public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e) && e.getComponent().isEnabled()) {
button = (JButton) e.getComponent();
timer.start();
}
}
@Override public void mouseReleased(MouseEvent e) {
timer.stop();
button = null;
}
@Override public void mouseExited(MouseEvent e) {
if (timer.isRunning()) {
timer.stop();
}
}
}
View in GitHub: Java, Kotlin解説
SCROLL_TAB_LAYOUT
を設定されたJTabbedPane
のタブスクロールボタンは矢印キーやJScrollBar
の矢印ボタンなどとは異なり、連続スクロール機能は実装されていないJTabbedPane
の子要素を検索して前方スクロールボタンと後方スクロールボタンを取得し、それぞれMouseListener
とActionListener
を追加MouseListener#mousePressed(...)
でTimer
を起動し、JButton#getModel()#isPressed()
とボタンが押下中の場合は対応する前方または後方スクロールアクションを繰り返し実行する- 繰り返しの間隔は
BasicScrollBarUI
のprivate final static int scrollSpeedThrottle = 60;
と同じ60ms
に設定 - 前方または後方スクロールアクションは
JTabbedPane#getActionMap().get("scrollTabsForwardAction")
、JTabbedPane#getActionMap().get("scrollTabsBackwardAction")
で取得 - JTabbedPane間でタブのドラッグ&ドロップ移動では
JButton#doClick()
を繰り返し実行してスクロールしているが、このサンプルではMouseListener#mouseReleased(...)
イベントでTimer
を中断しているのでこの方法は使用できない - 代わりに
Timer
のActionEvent
をJTabbedPane
のActionEvent
に変換してAction#actionPerformed(ActionEvent)
を実行している
- 繰り返しの間隔は
参考リンク
- JButtonがマウスで押されている間、アクションを繰り返すTimerを設定する
- JTabbedPaneの矢印ボタンに先頭もしくは末尾のタブまでスクロールするアクションを設定する
- JTabbedPane間でタブのドラッグ&ドロップ移動