• title: JTabbedPaneのタブタイトルを変更 tags: [JTabbedPane, GlassPane, JTextField] author: aterai pubdate: 2006-03-27 description: JTabbedPaneのタブタイトルを直接編集します。 hreflang:
       href: http://java-swing-tips.blogspot.com/2008/09/double-click-on-each-tab-and-change-its.html
       lang: en

概要

JTabbedPaneのタブタイトルを直接編集します。

サンプルコード

class EditableTabbedPane extends JTabbedPane {
  private final MyGlassPane panel  = new MyGlassPane();
  private final JTextField  editor = new JTextField();
  private final JFrame      frame;
  private Rectangle rect;

  public EditableTabbedPane(JFrame frame) {
    this.frame = frame;
    //......
    panel.add(editor);
    frame.setGlassPane(panel);
    panel.setVisible(false);
  }
  class MyGlassPane extends JPanel{
    public MyGlassPane() {
      super((LayoutManager) null);
      setOpaque(false);
      addMouseListener(new MouseAdapter() {
        @Override public void mouseClicked(MouseEvent me) {
          if(rect==null || rect.contains(me.getPoint())) return;
          renameTab();
        }
      });
    }
  }
  private void initEditor() {
    rect = getUI().getTabBounds(this, getSelectedIndex());
    rect.setRect(rect.x + 2, rect.y + 2, rect.width - 2, rect.height - 2);
    editor.setBounds(rect);
    editor.setText(getTitleAt(getSelectedIndex()));
  }
  private void startEditing() {
    initEditor();
    panel.setVisible(true);
    editor.requestFocusInWindow();
  }
  private void cancelEditing() {
    panel.setVisible(false);
  }
  private void renameTab() {
    if (editor.getText().trim().length() > 0) {
      setTitleAt(getSelectedIndex(), editor.getText());
    }
    panel.setVisible(false);
  }
}
View in GitHub: Java, Kotlin

解説

Excel風にJTabbedPaneのタブタイトルを直接編集しています。

編集が開始されると、対象となるタブ上にJTextFieldをレイアウトしたGlassPaneを表示しています。このGlassPaneには、編集中はフォーカスの移動が起こらないようにするためのFocusTraversalPolicyなどを設定しています。

  • 操作方法
    • マウスでタブをダブルクリック、またはタブを選択してEnterキーで編集開始
    • 編集中に入力欄以外をクリック、またはEnterキーでタイトル文字列が確定
    • 編集中はTabキーを押しても無視
    • Escキーで編集をキャンセル
    • 0文字で確定した場合も、キャンセル扱い

参考リンク

コメント