Swing/ScrollToFirstOrLastTabAction のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ScrollToFirstOrLastTabAction へ行く。
- 1 (2022-06-06 (月) 00:55:19)
- 2 (2022-08-08 (月) 12:38:32)
- 3 (2022-08-19 (金) 17:19:48)
- 4 (2022-08-20 (土) 00:14:27)
- 5 (2022-08-29 (月) 01:50:54)
- category: swing folder: ScrollToFirstOrLastTabAction title: JTabbedPaneの矢印ボタンに先頭もしくは末尾のタブまでスクロールするアクションを設定する tags: [JTabbedPane, JScrollPane, ActionMap] author: aterai pubdate: 2022-06-06T00:51:31+09:00 description: JTabbedPaneのスクロールタブレイアウトで矢印ボタンにCtrlキーを押しながらクリックすると先頭もしくは末尾のタブまでスクロールするアクションを追加します。 image: https://drive.google.com/uc?id=1eNSI9wDlm4F4yA6Xm0Df6YOcHqmTYlHS
概要
JTabbedPane
のスクロールタブレイアウトで矢印ボタンにCtrlキーを押しながらクリックすると先頭もしくは末尾のタブまでスクロールするアクションを追加します。
Screenshot
Advertisement
サンプルコード
class ScrollTabsAction extends AbstractAction {
private final JTabbedPane tabbedPane;
private final Action action;
private final int index;
protected ScrollTabsAction(JTabbedPane tabbedPane, Action action) {
super();
this.tabbedPane = tabbedPane;
this.action = action;
Object name = action.getValue(Action.NAME);
String forward = "scrollTabsForwardAction";
this.index = Objects.equals(name, forward) ? tabbedPane.getTabCount() - 1 : 0;
}
@Override public void actionPerformed(ActionEvent e) {
if (action != null && action.isEnabled()) {
boolean isCtrlDown = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
if (isCtrlDown) {
scrollTabAt(tabbedPane, index);
} else {
action.actionPerformed(new ActionEvent(tabbedPane,
ActionEvent.ACTION_PERFORMED, null,
e.getWhen(), e.getModifiers()));
}
}
}
public static void scrollTabAt(JTabbedPane tabbedPane, int index) {
Component cmp = null;
for (Component c : tabbedPane.getComponents()) {
if ("TabbedPane.scrollableViewport".equals(c.getName())) {
cmp = c;
break;
}
}
if (cmp instanceof JViewport) {
JViewport viewport = (JViewport) cmp;
Dimension d = tabbedPane.getSize();
Rectangle r = tabbedPane.getBoundsAt(index);
int gw = (d.width - r.width) / 2;
r.grow(gw, 0);
viewport.scrollRectToVisible(r);
}
}
}
View in GitHub: Java, Kotlin解説
scrollTabsForwardAction
JTabbedPane.getActionMap().get("scrollTabsForwardAction")
でアクションを取得AbstractAction#actionPerformed(...)
をオーバーライドしてCtrlキーが押されている(ActionEvent#getModifiers() & ActionEvent.CTRL_MASK) != 0
場合は、末尾タブtabbedPane.getTabCount() - 1
までスクロール、それ以外は先に取得したscrollTabsForwardAction
を実行するよう設定JTabbedPane.getActionMap().put("scrollTabsForwardAction", action)
でアクションを置換
scrollTabsBackwardAction
JTabbedPane.getActionMap().get("scrollTabsBackwardAction")
でアクションを取得AbstractAction#actionPerformed(...)
をオーバーライドしてCtrlキーが押されている(ActionEvent#getModifiers() & ActionEvent.CTRL_MASK) != 0
場合は、先頭タブ0
までスクロール、それ以外は先に取得したscrollTabsBackwardAction
を実行するよう設定JTabbedPane.getActionMap().put("scrollTabsBackwardAction", action)
でアクションを置換
scrollTabsForwardAction
、scrollTabsBackwardAction
はスクロールするだけなので、このサンプルで置換したアクションでも先頭末尾へのスクロールのみ実行してタブの選択状態は変化しない