TITLE:JTreeのノード編集をPopupから開始する

Posted by terai at 2010-04-19

JTreeのノード編集をPopupから開始する

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

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

tree.setCellEditor(new DefaultTreeCellEditor(
    tree, (DefaultTreeCellRenderer)tree.getCellRenderer()) {
  protected boolean canEditImmediately(EventObject e) {
    return (e instanceof MouseEvent)?false:super.canEditImmediately(e);
  }
});
tree.setEditable(true);
tree.setComponentPopupMenu(new TreePopupMenu());

解説

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


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

  • JTree#startEditingAtPathメソッドを使用する
  • JOptionPaneを表示して編集する
    • 入力された文字列をDefaultTreeModel#valueForPathChangedメソッドでJTreeに反映
      public TreePopupMenu() {
        super();
        add(new JMenuItem(new AbstractAction("Edit") {
          public void actionPerformed(ActionEvent e) {
            JTree tree = (JTree)getInvoker();
            if(path!=null) tree.startEditingAtPath(path);
          }
        }));
        add(new JMenuItem(new AbstractAction("Edit Dialog") {
          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);
              }
            }
          }
        }));
      //......
      

参考リンク

コメント