JTreeのノード編集をJPopupMenuからのみに制限する
Total: 5856
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTree
のノード編集をマウスクリックではなくJPopupMenu
からのみに制限します。
Screenshot
Advertisement
サンプルコード
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());
View in GitHub: Java, Kotlin解説
上記のサンプルでは、DefaultTreeCellEditor#isCellEditable
メソッドをオーバーライドしたCellEditor
を設定することでノードをマウスでクリックしても編集開始できないように制限しています。
JTree#startEditingAtPath
メソッドを使用してTreeCellEditor
で編集する方法と、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); } } } } })); // ...
- 入力された文字列を