TITLE:JTreeのノード編集をPopupからのみに制限する

Posted by at 2010-04-19

JTreeのノード編集をPopupからのみに制限する

JTreeのノード編集を、マウスクリックではなく、Popupからのみに制限します。

  • &jnlp;
  • &jar;
  • &zip;
StartEditingPopupMenu.png

サンプルコード

tree.setCellEditor(new DefaultTreeCellEditor(
    tree, (DefaultTreeCellRenderer)tree.getCellRenderer()) {
  @Override public boolean isCellEditable(java.util.EventObject e) {
    return (e instanceof MouseEvent)?false:super.isCellEditable(e);
  }
//@Override protected boolean canEditImmediately(EventObject e) {
////((MouseEvent)e).getClickCount()>2
//  return (e instanceof MouseEvent)?false:super.canEditImmediately(e);
//}
});
tree.setEditable(true);
tree.setComponentPopupMenu(new TreePopupMenu());
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、DefaultTreeCellEditor#isCellEditableメソッドをオーバーライドしたCellEditorを設定して、ノードをマウスでクリックしても編集開始できないように制限しています。


編集開始のためのポップアップメニューは、以下のような二種類を用意しています。

  • JTree#startEditingAtPathメソッドを使用する
  • JOptionPaneを表示して編集する
    • 入力された文字列をDefaultTreeModel#valueForPathChangedメソッドでJTreeに反映
      public TreePopupMenu() {
        super();
        add(new JMenuItem(new AbstractAction("Edit") {
          @Override public void actionPerformed(ActionEvent e) {
            JTree tree = (JTree)getInvoker();
            if(path!=null) tree.startEditingAtPath(path);
          }
        }));
        add(new JMenuItem(new AbstractAction("Edit Dialog") {
          @Override public void actionPerformed(ActionEvent e) {
            JTree tree = (JTree)getInvoker();
            if(path==null) return;
            Object node = path.getLastPathComponent();
            if(node instanceof DefaultMutableTreeNode) {
              DefaultMutableTreeNode leaf = (DefaultMutableTreeNode) node;
              textField.setText(leaf.getUserObject().toString());
              int result = JOptionPane.showConfirmDialog(
                tree, textField, "Rename",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
              if(result==JOptionPane.OK_OPTION) {
                String str = textField.getText();
                if(!str.trim().isEmpty())
                  ((DefaultTreeModel)tree.getModel()).valueForPathChanged(path, str);
              }
            }
          }
        }));
      //......
      

参考リンク

コメント