Swing/StartEditingPopupMenu のバックアップ(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/StartEditingPopupMenu へ行く。
- 1 (2010-04-19 (月) 13:46:44)
- 2 (2010-04-19 (月) 17:45:57)
- 3 (2012-09-08 (土) 05:17:46)
- 4 (2012-11-23 (金) 04:43:06)
- 5 (2013-01-02 (水) 14:08:56)
- 6 (2014-11-23 (日) 16:50:17)
- 7 (2015-02-14 (土) 10:20:08)
- 8 (2016-11-02 (水) 20:05:57)
- 9 (2017-11-21 (火) 16:05:58)
- 10 (2018-02-24 (土) 19:51:30)
- 11 (2019-05-22 (水) 19:34:28)
- 12 (2019-06-27 (木) 16:42:11)
- 13 (2021-03-03 (水) 07:23:10)
- 14 (2024-02-25 (日) 20:29:28)
- category: swing
folder: StartEditingPopupMenu
title: JTreeのノード編集をPopupからのみに制限する
tags: [JTree, JPopupMenu, TreeCellEditor, JOptionPane]
author: aterai
pubdate: 2010-04-19T13:46:44+09:00
description: JTreeのノード編集を、マウスクリックではなく、Popupからのみに制限します。
image:
hreflang:
href: http://java-swing-tips.blogspot.com/2013/03/jtree-node-edit-only-from-jpopupmenu.html lang: en
概要
JTree
のノード編集を、マウスクリックではなく、Popup
からのみに制限します。
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
メソッドを使用する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);
}
}
}
}));
//......