JTabbedPaneの矢印ボタンに先頭もしくは末尾のタブまでスクロールするアクションを設定する
Total: 932
, Today: 2
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
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
はスクロールするだけなので、このサンプルで置換したアクションでも先頭末尾へのスクロールのみ実行してタブの選択状態は変化しない