- PR -

JTreeのノードの削除の仕方

1
投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-01-29 10:36
こんにちは。いつもお世話になっています。
現在、JTreeの練習をしているのですが、ノードの削除の仕方がわかりません。
インターネットや書籍をいろいろ調べたのですが、ノードの追加の仕方はよく
見かけるのですが、削除の仕方の参考になるものが見あたらなく、ドキュメント
や書籍の情報を元にカンで作ってみた(以下)のですが、消えてくれません。

何が問題なのでしょうか?わかるかたおられませんか?
よろしくお願いします。
--------------------<以下ソースコード>-------------------------
import javax.swing.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;

public class test extends JFrame implements ActionListener{
DefaultMutableTreeNode root,node1,node2;
JTree tree;
test(String title){
super(title);

MutableTreeNode leaf1[] = {
new DefaultMutableTreeNode("リーフ1−1") ,
new DefaultMutableTreeNode("リーフ1−2")
};
MutableTreeNode leaf2[] = {
new DefaultMutableTreeNode("リーフ2−1") ,
new DefaultMutableTreeNode("リーフ2−2")
};
node1 = new DefaultMutableTreeNode("ノード1");
node2 = new DefaultMutableTreeNode("ノード2");
for(int i = 0 ; i < leaf1.length ;i++) node1.add(leaf1[i]);
for(int i = 0 ; i < leaf2.length ;i++) node2.add(leaf2[i]);

root = new DefaultMutableTreeNode("るーと");
root.add(node1);
root.add(node2);

tree = new JTree(root);
JScrollPane scp = new JScrollPane(tree);

JButton btn = new JButton("てすと");
btn.setActionCommand("てすと");
btn.addActionListener(this);

JPanel pnl = new JPanel( new BorderLayout());

pnl.add(btn,BorderLayout.NORTH);
pnl.add(scp, BorderLayout.CENTER);

getContentPane().add(pnl);
}

public static void main( String args[] ){
JFrame frm = new test("てすと");

frm.setSize(300,200);
frm.setVisible(true);
frm.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

}

public void actionPerformed(ActionEvent event){
if(event.getActionCommand().equals("てすと")){
if( tree.getSelectionPath()!=null){
System.out.println(tree.getSelectionPath().toString()+"を選択してボタン押した");
tree.removeSelectionPath(tree.getSelectionPath());
}
}
}
}

YKID
常連さん
会議室デビュー日: 2002/04/09
投稿数: 29
投稿日時: 2003-01-29 13:09
こんにちは、YKIDです。

引用:

maruさんの書き込み (2003-01-29 10:36) より:
こんにちは。いつもお世話になっています。
現在、JTreeの練習をしているのですが、ノードの削除の仕方がわかりません。
インターネットや書籍をいろいろ調べたのですが、ノードの追加の仕方はよく
見かけるのですが、削除の仕方の参考になるものが見あたらなく、ドキュメント
や書籍の情報を元にカンで作ってみた(以下)のですが、消えてくれません。

何が問題なのでしょうか?わかるかたおられませんか?
よろしくお願いします。



やっつけですが、こんな感じでNodeが消えるようになります。

vvvvv 以下、ソース(actionPerformed()の個所のみ) vvvvv
コード:

public void actionPerformed(ActionEvent event){
if(event.getActionCommand().equals("てすと")){
if( tree.getSelectionPath()!=null){
// これは選択を解除するだけ
//tree.removeSelectionPath(tree.getSelectionPath());
System.out.println(tree.getSelectionPath().toString()+"を選択してボタン押した");

TreePath[] tp = tree.getSelectionPaths();
for ( int i = 0; i < tp.length; i++ ) {
int count = tp[i].getPath().length;
// ルート以外を消す場合
if ( count >= 2 ) {
javax.swing.tree.MutableTreeNode parent = (javax.swing.tree.MutableTreeNode) tp[i].getPath()[count - 2];
parent.remove((javax.swing.tree.MutableTreeNode) tp[i].getPath()[count - 1]);
// ルートを消す場合
} else if ( count == 1 ) {
javax.swing.tree.DefaultTreeModel model = (javax.swing.tree.DefaultTreeModel) tree.getModel();
model.setRoot(null);
}
}
// ツリーが更新されたことを通知
tree.updateUI();
}
}
}


^^^^^ 以上、ソース(actionPerformed()の個所のみ) ^^^^^

参考までに。


[ メッセージ編集済み 編集者: YKID 編集日時 2003-01-29 13:10 ]

[ メッセージ編集済み 編集者: YKID 編集日時 2003-01-30 01:16 ]
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-01-29 14:31
ご教示、ありがとうございます。確かにこの方法でも消えますね。
以下のアドレスのチュートリアルにJTreeのサンプルが載っていました。
http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html

英語がわからないのですが、みようみまねで以下のコードでも消えるようになりま
した。ただしルートは消えませんが。

だけど、消えるけどなぜこのようにすればいいのかがさっぱりわかりません。
DefaultMutableTreeNode、DefaultTreeModel、MutableTreeNodeなどの違いや
使い方がさっぱりわかりません。
違いのわかるかたおられますでしょうか?

--------------------<以下ソースコード>-------------------------
import javax.swing.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;

public class test extends JFrame implements ActionListener{
DefaultMutableTreeNode root,node1,node2;
JTree tree;
protected DefaultTreeModel treeModel; // <==追加
test(String title){
super(title);

MutableTreeNode leaf1[] = {
new DefaultMutableTreeNode("リーフ1−1") ,
new DefaultMutableTreeNode("リーフ1−2")
};
MutableTreeNode leaf2[] = {
new DefaultMutableTreeNode("リーフ2−1") ,
new DefaultMutableTreeNode("リーフ2−2")
};
node1 = new DefaultMutableTreeNode("ノード1");
node2 = new DefaultMutableTreeNode("ノード2");
for(int i = 0 ; i < leaf1.length ;i++) node1.add(leaf1[i]);
for(int i = 0 ; i < leaf2.length ;i++) node2.add(leaf2[i]);

root = new DefaultMutableTreeNode("るーと");
root.add(node1);
root.add(node2);

treeModel = new DefaultTreeModel(root);// <==追加

tree = new JTree(treeModel);// <==変更
JScrollPane scp = new JScrollPane(tree);

JButton btn = new JButton("てすと");
btn.setActionCommand("てすと");
btn.addActionListener(this);

JPanel pnl = new JPanel( new BorderLayout());

pnl.add(btn,BorderLayout.NORTH);
pnl.add(scp, BorderLayout.CENTER);

getContentPane().add(pnl);
}

public static void main( String args[] ){
JFrame frm = new test("てすと");

frm.setSize(300,200);
frm.setVisible(true);
frm.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

}

/* 以下大幅に変更 */
public void actionPerformed(ActionEvent event){
if(event.getActionCommand().equals("てすと")){
TreePath currentSelection = tree.getSelectionPath();
if( currentSelection != null){
System.out.println(currentSelection.toString()+"を選択してボタン押した");

DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)
(currentSelection.getLastPathComponent());
MutableTreeNode parent = (MutableTreeNode)(currentNode.getParent());
if (parent != null) {
treeModel.removeNodeFromParent(currentNode);
return;
}
}
}
}
}

YKID
常連さん
会議室デビュー日: 2002/04/09
投稿数: 29
投稿日時: 2003-01-30 06:07
こんばんわ、YKIDです。

引用:

maruさんの書き込み (2003-01-29 14:31) より:

だけど、消えるけどなぜこのようにすればいいのかがさっぱりわかりません。
DefaultMutableTreeNode、DefaultTreeModel、MutableTreeNodeなどの違いや
使い方がさっぱりわかりません。
違いのわかるかたおられますでしょうか?




JTreeは基本的にMVCに則して実装されています。
TreeModelはJTreeのモデルに該当し、JTreeからデータを操作するための機能が定義されています。DefaultTreeModelはTreeModelの実装です。

TreeNodeは、木構造のデータ構造そのものを定義したインターフェイスです。TreeNodeのサブインターフェイスであるMutableTreeNodeは子の追加や値の変更を操作に加えたものです。
DefaultMutableTreeNodeはMutableTreeNodeの実装です。

つまり、TreeModelはJTreeから操作するデータ構造のモデルで、木構造を取るデータの実体がDefaultMutableTreeNodeってところです。

以下は、ソースにコメントを付け加えたものです。
参考までに
vvvvv actionPerformed()のみ vvvvv
コード:
public void actionPerformed(ActionEvent event){ 
	if(event.getActionCommand().equals("てすと")){
		// ツリーから選択しているNodeまでのTreePathを取得
		TreePath currentSelection = tree.getSelectionPath();

		if( currentSelection != null){ 
			System.out.println(currentSelection.toString()+"を選択してボタン押した"); 

			// TreePathで表現した、一番末尾のパスをTreeNodeで返す。
			// つまり選択しているTreeNodeの取得をしている
			DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) currentSelection.getLastPathComponent();

			// 選択している親を取得している
			MutableTreeNode parent = (MutableTreeNode) currentNode.getParent();
			if (parent != null) {
				// 親がある場合は、currentNodeを親から削除
				treeModel.removeNodeFromParent(currentNode);
				return;
			// 親がなければ、currentNodeはルート
			} else {
				treeModel.setRoot(null);
			}
		}
	}
}


^^^^^ actionPerformed()のみ ^^^^^
1

スキルアップ/キャリアアップ(JOB@IT)