概要

JTabbedPaneのタブエリアをマウスの左ボタンでダブルクリックして新規タブを作成します。

サンプルコード

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を作成し、JTabbedPaneActionMapに追加
    • JPopupMenuからの新規タブ追加もこのアクションを実行する
  • JTabbedPaneMouseListenerを追加し、各タブ上を除くタブエリア内でマウス左ボタンのダブルクリックが実行されたら上記のタブ追加アクションを取得して実行

参考リンク

コメント