• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTabbedPaneのタブタイトルを変更
#navi(../)
RIGHT:Posted by [[terai]] at 2006-03-27
#tags()
RIGHT:Posted by &author(aterai); at 2006-03-27
*JTabbedPaneのタブタイトルを変更 [#l3a0e3fa]
JTabbedPaneのタブタイトルを直接編集します。

-&jnlp;
-&jar;
-&zip;

#screenshot
//#screenshot
#ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTMGR-jIQI/AAAAAAAAAYo/g3tGLp5zrdY/s800/EditTabTitle.png)

**サンプルコード [#o93646f5]
#code{{
#code(link){{
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() {
        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);
  }
}
}}

**解説 [#t11e99b7]
Excel風にJTabbedPaneのタブタイトルを直接編集しています。

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

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

**参考リンク [#k3c4771a]
-[[Cursorを砂時計に変更>Swing/WaitCursor]]
-[[JTabbedPaneのタブにJTextFieldを配置してタイトルを編集>Swing/TabTitleEditor]]
--JDK 6 版です。タブにJTextFieldをJTabbedPane#setTabComponentAt メソッドを使用して配置しています。
-[[Swing - Floating text field>http://forums.sun.com/thread.jspa?threadID=5328839]]
-[http://forums.sun.com/thread.jspa?threadID=5328839 Swing - Floating text field]
--JPopupMenuにJTextFieldを配置することで同様のことを行うコードをKelVarnsonさんが投稿しています。

**コメント [#s3b3f708]
- 1.4系だと編集開始時にうまく選択状態にできない場合があるようです。 -- [[terai]] &new{2006-03-27 (月) 15:03:01};
-- 上記の問題と、選択状態がマウスの移動で外れてしまうバグを修正しました。 -- [[terai]] &new{2006-03-29 (水) 03:26:56};
- 余白などを追加するとエディタがずれるバグを修正しました。 -- [[terai]] &new{2006-09-01 (金) 15:04:00};
- 1.4系だと編集開始時にうまく選択状態にできない場合があるようです。 -- [[aterai]] &new{2006-03-27 (月) 15:03:01};
-- 上記の問題と、選択状態がマウスの移動で外れてしまうバグを修正しました。 -- [[aterai]] &new{2006-03-29 (水) 03:26:56};
- 余白などを追加するとエディタがずれるバグを修正しました。 -- [[aterai]] &new{2006-09-01 (金) 15:04:00};
- setTabComponentAt(...)メソッドで閉じるボタンなどと併用していた場合、編集後に文字列の長さがおかしくなるので、revalidate()するように修正。 -- [[aterai]] &new{2010-08-10 (火) 16:49:52};

#comment