JTabbedPaneのタブエリアをダブルクリックして新規タブを作成する
Total: 210
, Today: 4
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTabbedPane
のタブエリアをマウスの左ボタンでダブルクリックして新規タブを作成します。
Screenshot
Advertisement
サンプルコード
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
Action addAction = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
JTabbedPane tabs = (JTabbedPane) e.getSource();
int cnt = tabs.getTabCount();
tabs.addTab("Untitled-" + cnt, new JScrollPane(new JTextArea()));
tabs.setSelectedIndex(cnt);
}
};
InputMap im = tabbedPane.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = tabbedPane.getActionMap();
String addKey = "AddTab";
addAction.putValue(Action.ACTION_COMMAND_KEY, addKey);
im.put(KeyStroke.getKeyStroke("ctrl N"), addKey);
am.put(addKey, addAction);
tabbedPane.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e) {
boolean leftButton = e.getButton() == MouseEvent.BUTTON1;
boolean doubleClick = e.getClickCount() >= 2;
JTabbedPane tabs = (JTabbedPane) e.getComponent();
int idx = tabs.indexAtLocation(e.getX(), e.getY());
Rectangle r = getTabAreaBounds(tabs);
if (leftButton && doubleClick && idx < 0 && r.contains(e.getPoint())) {
Optional.ofNullable(tabs.getActionMap().get(addKey)).ifPresent(a -> {
ActionEvent ae = new ActionEvent(
tabs, ActionEvent.ACTION_PERFORMED, addKey);
a.actionPerformed(ae);
});
}
}
});
View in GitHub: Java, Kotlin解説
- 適当なタブタイトルでコンテンツが
JTextArea
のタブをJTabbedPane
に追加するAbstractAction
を作成し、JTabbedPane
のActionMap
に追加JPopupMenu
からの新規タブ追加もこのアクションを実行する
JTabbedPane
にMouseListener
を追加し、各タブ上を除くタブエリア内でマウス左ボタンのダブルクリックが実行されたら上記のタブ追加アクションを取得して実行JTabbedPane#indexAtLocation(x, y)
が-1
の場合タブ上ではない- タブエリア内かどうかは
TabbedPane.tabAreaInsets
とTabbedPane.contentBorderInsets
の余白を考慮してタブエリア領域を取得して判断- JTabbedPaneのTabAreaで開くJPopupMenuを設定する
TabbedPane.contentBorderInsets
をすべて0
にする、またはコンテンツエリアの余白をダブルクリックで新規タブ生成を許可する場合はこのチェックは不要
- 左ボタンのクリックかどうかは
MouseEvent#getButton() == MouseEvent.BUTTON1
で判断 - ダブルクリックかどうかは
MouseEvent#getClickCount() >= 2
で判断