TITLE:JTabbedPaneのタブタイトルを変更
#navi(../)
*JTabbedPaneのタブタイトルを変更 [#l3a0e3fa]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-03-27~
更新日:&lastmod;

#contents

**概要 [#ga7c35e5]
JTabbedPaneのタブタイトルを直接編集します。

#screenshot

**サンプルコード [#o93646f5]
 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;

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

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

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

**参考リンク [#k3c4771a]
-[[Cursorの変更>Swing/WaitCursor]]

**コメント [#s3b3f708]
- 1.4系だと編集開始時にうまく選択状態にできない場合があるようです。 -- [[terai]] &new{2006-03-27 (月) 15:03:01};
-- 上記の問題と、選択状態がマウスの移動で外れてしまうバグを修正。 -- [[terai]] &new{2006-03-29 (水) 03:26:56};

#comment