概要

JTabbedPaneで選択されたタブにJTextFieldを配置し、そのタイトルを編集します。

サンプルコード

private Component tabComponent = null;
private int editing_idx = -1;
private int len = -1;
private Dimension dim;
private void startEditing() {
  //System.out.println("start");
  editing_idx  = tabbedPane.getSelectedIndex();
  tabComponent = tabbedPane.getTabComponentAt(editing_idx);
  tabbedPane.setTabComponentAt(editing_idx, editor);
  editor.setVisible(true);
  editor.setText(tabbedPane.getTitleAt(editing_idx));
  editor.selectAll();
  editor.requestFocusInWindow();
  len = editor.getText().length();
  dim = editor.getPreferredSize();
  editor.setMinimumSize(dim);
}
private void cancelEditing() {
  //System.out.println("cancel");
  if (editing_idx >= 0) {
    tabbedPane.setTabComponentAt(editing_idx, tabComponent);
    editor.setVisible(false);
    editing_idx = -1;
    len = -1;
    tabComponent = null;
    editor.setPreferredSize(null);
  }
}
private void renameTabTitle() {
  //System.out.println("rename");
  String title = editor.getText().trim();
  if (editing_idx >= 0 && !title.isEmpty()) {
    tabbedPane.setTitleAt(editing_idx, title);
  }
  cancelEditing();
}
view all

解説

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

JDK 6で導入された、JTabbedPane#setTabComponentAtメソッドを使用してタブにJTextFieldを追加しています。

操作方法などは、以下のように、GlassPaneを使用しているJTabbedPaneのタブタイトルを変更と同じですが、こちらは文字が入力されるたびに(JTabbedPane#revalidateしているので)タブの幅が広がります。

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

参考リンク

コメント

  • setTabComponentAt(...)メソッドで閉じるボタンなどと併用していた場合、編集後にそのボタンなどが消える不具合をメールで指摘してもらったので、修正。 -- aterai