- - PR -
JTreeのノードの削除の仕方
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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()); } } } } | ||||||||
|
投稿日時: 2003-01-29 13:09
こんにちは、YKIDです。
やっつけですが、こんな感じでNodeが消えるようになります。 vvvvv 以下、ソース(actionPerformed()の個所のみ) vvvvv
^^^^^ 以上、ソース(actionPerformed()の個所のみ) ^^^^^ 参考までに。 [ メッセージ編集済み 編集者: YKID 編集日時 2003-01-29 13:10 ] [ メッセージ編集済み 編集者: YKID 編集日時 2003-01-30 01:16 ] | ||||||||
|
投稿日時: 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; } } } } } | ||||||||
|
投稿日時: 2003-01-30 06:07
こんばんわ、YKIDです。
JTreeは基本的にMVCに則して実装されています。 TreeModelはJTreeのモデルに該当し、JTreeからデータを操作するための機能が定義されています。DefaultTreeModelはTreeModelの実装です。 TreeNodeは、木構造のデータ構造そのものを定義したインターフェイスです。TreeNodeのサブインターフェイスであるMutableTreeNodeは子の追加や値の変更を操作に加えたものです。 DefaultMutableTreeNodeはMutableTreeNodeの実装です。 つまり、TreeModelはJTreeから操作するデータ構造のモデルで、木構造を取るデータの実体がDefaultMutableTreeNodeってところです。 以下は、ソースにコメントを付け加えたものです。 参考までに vvvvv actionPerformed()のみ vvvvv
^^^^^ actionPerformed()のみ ^^^^^ | ||||||||
1
