JTreeノード編集、前後の値をチェックするサンプル

JTreeのノード編集で、編集後の値をチェックしてファイル名を変更したり、
値が気に入らなかったら警告ダイアログを出しなと思ったので、
編集完了をトラップして前後の値をチェックするサンプルを書いてみました。

ポイント

  1. CellEditorListenerを実装します
  2. セルエディターにCellEditorListenerを追加する
  3. CellEditorListener.editingStoppedで編集完了をトラップできます。
  4. 新しい値はJTree.getCellEditor().getCellEditorValue()で取得できます
  5. 現在の値は(DefaultMutableTreeNode) getSelectionPath().getLastPathComponent()で取得できます
  6. 新しい値と古い値をチェックして、気に入らない場合は例外を投げましょう。例外を投げれば編集再開、投げなければ編集完了になります。

実行結果


ノード編集の完了をトラップして、ダイアログを表示しました。

ソース JTreeCheckOldNewValue.java

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTree;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.tree.DefaultMutableTreeNode;
 
// ポイント1 CellEditorListenerを実装します
public class JTreeCheckOldNewValue extends JTree implements CellEditorListener {
 
	public static void main(String[] args) {
		JFrame f = new JFrame("JTreeノード編集、前後の値をチェックする");
		f.setBounds(100, 100, 200, 400);
		f.add(new JTreeCheckOldNewValue());
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
 
	public JTreeCheckOldNewValue() {
		init();
	}
 
	private void init() {
		setEditable(true);
		// ポイント2 セルエディターにCellEditorListenerを追加する
		getCellEditor().addCellEditorListener(this);
	}
 
	// ポイント3 editingStoppedで編集完了をトラップできます。
	@Override
	public void editingStopped(ChangeEvent e) {
		// CellEditorListener
		// ツリーノードの編集が完了するとここにくる
 
		// ポイント4 新しい値はJTree.getCellEditor().getCellEditorValue()で取得できます
		String newValue = getCellEditor().getCellEditorValue().toString();
 
		// ポイント5 現在の値は(DefaultMutableTreeNode) getSelectionPath().getLastPathComponent()で取得できます
		DefaultMutableTreeNode n = (DefaultMutableTreeNode) getSelectionPath()
				.getLastPathComponent();
		String nowValue = n.getUserObject().toString();
 
		// ポイント6 新しい値と古い値をチェックして、気に入らない場合は例外を投げましょう。
		// 例外を投げれば編集再開、投げなければ編集完了になります。
 
		// 値が変わっていない場合、確認ダイアログを出す
		if (newValue.equals(nowValue)) {
			int ret = JOptionPane.showConfirmDialog(this, "値が変わってないけどいいんですか?");
			// OK以外は例外を投げて、編集を再開させる
			if (ret != JOptionPane.OK_OPTION) {
				throw new RuntimeException("編集再開してください");
			}
		}
	}
 
	@Override
	public void editingCanceled(ChangeEvent e) {
		// CellEditorListener
	}
}
 

アフィリエイト ここまで

最終更新:2012年09月23日 05:09