TITLE:JTabbedPaneのタブタイトルを変更

JTabbedPaneのタブタイトルを変更

編集者:Terai Atsuhiro
作成日:2006-03-27
更新日:2023-02-22 (水) 11:06:41

概要

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

#screenshot

サンプルコード

class EditableTabbedPane extends JTabbedPane {
  private final MyGlassPane panel  = new MyGlassPane();
  private final JTextField  editor = new JTextField();
  private final JFrame      frame;
  private final FocusTraversalPolicy policy;
  private FocusTraversalPolicy ftp;
  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() {
        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() {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        initEditor();
        ftp = frame.getFocusTraversalPolicy();
        panel.setVisible(true);
        editor.requestFocusInWindow();
        frame.setFocusTraversalPolicy(policy);
      }
    });
  }
  private void cancelEditing() {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        frame.setFocusTraversalPolicy(ftp);
        panel.setVisible(false);
      }
    });
  }
  private void renameTab() {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        frame.setFocusTraversalPolicy(ftp);
        if(editor.getText().trim().length()>0) {
          setTitleAt(getSelectedIndex(), editor.getText());
        }
        panel.setVisible(false);
      }
    });
  }
}
  • &jnlp;
  • &jar;
  • &zip;

解説

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

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

  • 操作方法
    • ダブルクリック、またはリターンで編集開始
    • 入力欄以外をクリック、またはリターンで確定
    • Escでキャンセル
    • 0文字で確定するとキャンセル扱い

参考リンク

コメント

  • 1.4系だと編集開始時にうまく選択状態にできない場合があるようです。 -- terai
    • 上記の問題と、選択状態がマウスの移動で外れてしまうバグを修正しました。 -- terai