How to show only all children of selected node in JTree?

Dear friends:

I have Two Panels, PA and PB,

PA has a Jtree as code below, and PB listens to PA,

I hope to do following,

If I select a node called A in PA, then Node A's all children such as A1, A2, A3 will be displayed in PB, but not display A1, A2, A3's children such as A3 has C1, C2, C3, C4 & C5, until I select A3 then PB will display only all A3's children: C1, C2, C3, C4 & C5;

i.e, only populate each ONE level of children of Node A or any node I select, not its grandchildren and its grand-grand children;

Please help how to do it?

I tried amny times, failed.

Thanks

[1]. PA panel code:

package com.atest;

import java.awt.BorderLayout;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.util.Enumeration;

import java.awt.Dimension;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextField;

import javax.swing.JTree;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.TreeModel;

import javax.swing.tree.TreePath;

publicclass DefaultMutableTreeMainextends JPanel{

protected DefaultMutableTreeNodetop =new DefaultMutableTreeNode("Options");

protected DefaultMutableTreeNode selectedNode =null;

protectedfinal JTree tree;

protectedfinal JTextField jtf;

protected Enumeration vEnum =null;

private TreeModel m;

protected DefaultMutableTreeNode getDefaultMutableTreeNode(){

//textArea.getText();

return selectedNode;

}

protected DefaultMutableTreeNode setDefaultMutableTreeNode(DefaultMutableTreeNode tt){

//textArea.getText();

selectedNode = tt;

return selectedNode;

}

protected TreeModel getJTModel(){

//textArea.getText();

return m;

}

protected TreeModel setJTModel(TreeModel ta){

m = ta;

return m;

}

public DefaultMutableTreeMain(){

setSize(300,300);

setLayout(new BorderLayout());

DefaultMutableTreeNode a =new DefaultMutableTreeNode("A");

top.add(a);

DefaultMutableTreeNode a1 =new DefaultMutableTreeNode("A1");

a.add(a1);

DefaultMutableTreeNode a2 =new DefaultMutableTreeNode("A2");

a.add(a2);

DefaultMutableTreeNode a3 =new DefaultMutableTreeNode("A3");

a.add(a3);

DefaultMutableTreeNode b =new DefaultMutableTreeNode("B");

top.add(b);

DefaultMutableTreeNode b1 =new DefaultMutableTreeNode("B1");

b.add(b1);

DefaultMutableTreeNode b2 =new DefaultMutableTreeNode("B2");

b.add(b2);

DefaultMutableTreeNode b3 =new DefaultMutableTreeNode("B3");

b.add(b3);

DefaultMutableTreeNode c =new DefaultMutableTreeNode("C");

a3.add(c);

DefaultMutableTreeNode c1 =new DefaultMutableTreeNode("C1");

c.add(c1);

DefaultMutableTreeNode c2 =new DefaultMutableTreeNode("C2");

c.add(c2);

DefaultMutableTreeNode c3 =new DefaultMutableTreeNode("C3");

c.add(c3);

DefaultMutableTreeNode c4 =new DefaultMutableTreeNode("C4");

c.add(c4);

DefaultMutableTreeNode c5 =new DefaultMutableTreeNode("C5");

c.add(c5);

tree =new JTree(top);

JScrollPane jsp =new JScrollPane(tree);

jsp.setPreferredSize(new Dimension(400,300));

add(jsp, BorderLayout.CENTER);

jtf =new JTextField("", 20);

add(jtf, BorderLayout.SOUTH);

tree.addMouseListener(new MouseAdapter(){

publicvoid mouseClicked(MouseEvent me){

TreePathpath = tree.getSelectionPath();

DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)path.getLastPathComponent();

TreePath tp = tree.getPathForLocation(me.getX(), me.getY());

setDefaultMutableTreeNode(selectedNode);

System.out.println("Current node selected is (tp.toString()=" + tp.toString());

System.out.println("Current node selected is getDefaultMutableTreeNode()=" + getDefaultMutableTreeNode());

if (tp !=null){

jtf.setText(tp.toString());

System.out.println("It Has Children as selectedNode.getChildCount()= " + selectedNode.getChildCount());

Enumeration vEnum = selectedNode.children();

int i = 0;

while(vEnum.hasMoreElements()){

System.out.println("2 selectedNode = " + path.toString() +" has " + i++ +" Children in vEnum.nextElement(" + i +") = " + vEnum.nextElement());

}

}

else

jtf.setText("");

}

});

}

publicstaticvoid main(String[] args){

JFrame frame =new JFrame();

frame.getContentPane().add(new DefaultMutableTreeMain());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(400, 400);

frame.setVisible(true);

}

}

[2]. PB Panel code

package com.atest;

import java.awt.BorderLayout;

import javax.swing.JScrollPane;

import javax.swing.JTree;

import javax.swing.JPanel;

import javax.swing.event.TreeSelectionEvent;

import javax.swing.event.TreeSelectionListener;

import javax.swing.tree.*;

import javax.swing.JButton;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.DefaultTreeModel;

import javax.swing.tree.TreePath;

publicclass DefaultMutableTreeSubextends JPanelimplements java.io.Serializable{

private JButton removeButton;

private JButton addButton;

JTree tree;

private TreeModel m;

protected TreeDragSource ds;

protected TreeDropTarget dt;

protected TreeModel getJTModel(){

//textArea.getText();

return m;

}

protected TreeModel setJTModel(TreeModel ta){

m = ta;

return m;

}

protected DefaultTreeModel model;

protected DefaultMutableTreeNode rootNode;

DefaultMutableTreeMain dmm =null;

JPanel inputPanel =new JPanel();

public JPanel SLTreeDNDEditableDynamic(DefaultMutableTreeMain tdnd ){

//super("Rearrangeable Tree");

setSize(400,450);

dmm = tdnd;

setLayout(new BorderLayout());

inputPanel.setLayout(new BorderLayout());

JPanel outputPanel =new JPanel();

System.out.println("Sub selectedNode tdnd= " + tdnd);

tdnd.tree.addTreeSelectionListener(new TreeSelectionListener(){

publicvoid valueChanged(TreeSelectionEvent evt){

TreePath[] paths = evt.getPaths();

TreePathpath = dmm.tree.getSelectionPath();

DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)path.getLastPathComponent();

DefaultMutableTreeNode itemNode = dmm.getDefaultMutableTreeNode();

System.out.println("Sub node selected is dmm.getDefaultMutableTreeNode()=" + dmm.getDefaultMutableTreeNode());

model =new DefaultTreeModel(itemNode);

tree =new JTree(model);

System.out.println("Sub selectedNode paths= " + paths);

System.out.println("Sub selectedNode path= " + path);

System.out.println("Sub selectedNode = " + selectedNode);

System.out.println("Sub itemNode = " + itemNode);

tree.putClientProperty("JTree.lineStyle","Angled");

tree.setRootVisible(true);

inputPanel.add(new JScrollPane(tree),BorderLayout.CENTER);

}

});

return inputPanel;

}

public DefaultMutableTreeSub(){

super();

}

}

thanks

sunny

[13156 byte] By [sunnymanmana] at [2007-11-27 0:21:31]
# 1

Sounds like a hierarchal logic issue, not necessarily a Swing issue.

In theory, I think you'd want to make a new tree based on only the nodes of the current selection.

I think the best solution would be some quick node loop dependent on TreePath.getChildCount plus the index of the selected item.

perhaps:

JList rightPane = new JList(getChildNodes(leftTree));

private static List<Object> getChildNodes(JTree j) {

Object parent = j.getLastSelectedPathComponent();

int childNodeCount = j.getModel().getChildCount(parent);

List<Object> results = new ArrayList()<Object>;

for (i = 0; i < childNodeCount; i++) {

results.add(parent, i);

}

return results;

}

None of that code is tested, but it's what would make logical sense to me... :\

-FBL

FBLa at 2007-7-11 22:15:25 > top of Java-index,Desktop,Core GUI APIs...
# 2

Thanks so much, I use your code and import followig:

import java.util.ArrayList;

import java.awt.List;

but

private static List<Object> getChildNodes(JTree j) {

Object parent = j.getLastSelectedPathComponent();

int childNodeCount = j.getModel().getChildCount(parent);

List<Object> results = new ArrayList()<Object>;

for (i = 0; i < childNodeCount; i++) {

results.add(parent, i);

}

return results;

}

here List<Object> and ArrayList()<Object> show red,

Is my JDK version problem?

my one is JKD

C:\temp\swing>java -version

java version "1.4.2_08"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)

Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)

Error as follows:

C:\temp\swing>javac DefaultMutableTreeSub.java

DefaultMutableTreeSub.java:38: <identifier> expected

private static List<Object> getChildNodes(JTree j) {

^

1 error

any idea?

Thanks

sunnymanmana at 2007-7-11 22:15:25 > top of Java-index,Desktop,Core GUI APIs...
# 3

Sorry, I should have been more specific.

I'm using Java 1.5 and 1.6, but it appears List<> and ArrayList<> have been around since 1.2, so you're ok.

Try:

import java.util.List;

instead of

import java.awt.List;

If you're already importing java.awt.*, then just use java.util.List in place of List in the above code. : )

-FBL

FBLa at 2007-7-11 22:15:25 > top of Java-index,Desktop,Core GUI APIs...
# 4
Thanks a lot!
sunnymanmana at 2007-7-11 22:15:25 > top of Java-index,Desktop,Core GUI APIs...
# 5
do u have a sample code?im doing the same tin! but i cant achieve the result!pls help..urgent!!!=x
sia0001a at 2007-7-11 22:15:25 > top of Java-index,Desktop,Core GUI APIs...