Swing/StartEditingPopupMenu の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/StartEditingPopupMenu へ行く。
- Swing/StartEditingPopupMenu の差分を削除
--- category: swing folder: StartEditingPopupMenu title: JTreeのノード編集をPopupからのみに制限する title: JTreeのノード編集をJPopupMenuからのみに制限する tags: [JTree, JPopupMenu, TreeCellEditor, JOptionPane] author: aterai pubdate: 2010-04-19T13:46:44+09:00 description: JTreeのノード編集をマウスクリックではなくJPopupMenuからのみに制限します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTTy9Cda5I/AAAAAAAAAlA/6uCGiCD2iGY/s800/StartEditingPopupMenu.png hreflang: href: https://java-swing-tips.blogspot.com/2013/03/jtree-node-edit-only-from-jpopupmenu.html lang: en --- * 概要 [#summary] `JTree`のノード編集をマウスクリックではなく`JPopupMenu`からのみに制限します。 #download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTTy9Cda5I/AAAAAAAAAlA/6uCGiCD2iGY/s800/StartEditingPopupMenu.png) * サンプルコード [#sourcecode] #code(link){{ tree.setCellEditor(new DefaultTreeCellEditor( tree, (DefaultTreeCellRenderer) tree.getCellRenderer()) { @Override public boolean isCellEditable(EventObject e) { return !(e instanceof MouseEvent) && 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()); }} * 解説 [#explanation] 上記のサンプルでは、`DefaultTreeCellEditor#isCellEditable`メソッドをオーバーライドした`CellEditor`を設定することでノードをマウスでクリックしても編集開始できないように制限しています。 ---- - `JTree#startEditingAtPath`メソッドを使用して`TreeCellEditor`で編集する方法と、`JOptionPane`を開いて編集する方法の二種類をメニューに追加 -- 入力された文字列を`DefaultTreeModel#valueForPathChanged`メソッドで`JTree`に反映 #code{{ 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); } } } } })); // ... }} * 参考リンク [#reference] - [[JTreeのノード上でJPopupMenuを表示>Swing/TreeNodePopupMenu]] * コメント [#comment] #comment #comment