2013-12-19 17 views
7

JTreeの各ノードに異なるアイコンを設定したいのですが、実際には各ノードをデータベースからロードしていますが、whileは各アイコンをルートのように設定しています。葉または親。このように:Jtreeの各ノードにアイコンを設定

private ResultSet myResultSet; 
protected DefaultTreeModel treeModel; 
private DefaultMutableTreeNode rootNode,childNode,parent1,parent2; 

そして、これは私が私のノードを設定するコードです:

すべての私の宣言はグローバルで

myResultSet=rtnNodes(); /*Method that returns a RS with my nodes*/ 
while(myResultSet.next()){ 
    switch(myResultSet.getInt(1)){ /*The first column is the type of node: root, parent, leaf...*/ 
    case 0: treeModel = new DefaultTreeModel((rootNode=new DefaultMutableTreeNode(myResultSet.getString(2)))); break; /*root node*/ 
    case 1: case 4: parent1 = parent2 = makeNode(rootNode); break; /*parent node*/ 
    case 2: makeNode(parent2); break; /*leaf node*/ 
    case 3: parent2 = makeNode(parent1); break; /*sub patern node*/ 
    } /*makeNode is the method where I create the nodes*/ 
} 

メソッドをmakeNodeはこれです:

public DefaultMutableTreeNode makeNode(DefaultMutableTreeNode parent){ 
    //The second column in the RS is the name of the node 
    treeModel.insertNodeInto((childNode=new DefaultMutableTreeNode(myResultSet.getString(2))),parent,parent.getChildCount()); 
    return childNode; 
} 

トレモデルをノードで塗りつぶした後、モデルをJTree:

に設定しました
myJTree.setModel(treeModel); 
myJTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 

しかし、問題があります。私はアイコンを設定しようとするとき。私はmyTreeRendererと呼ばれるサブクラスを作成し、私はこれを使用します。

myJTree.setCellRenderer(new treeRenderer()); 

しかし、私が望むようにはアイコンが設定されていない、サブクラスでは、次のとおりです。

私は、それぞれのアイコンを設定するにはどうすればよい
private ImageIcon root,parent,leaf; 

public myTreeRenderer() { 
    root=setIcons(2); /*setIcons is a method that I dont publish in this post, that helps me to set the path of the icons*/ 
    parent=setIcons(3); 
    leaf=setIcons(4); 
} 

@Override 
public Component getTreeCellRendererComponent(JTree tree,Object value,boolean selected,boolean expanded,boolean leaf,int row,boolean hasFocus){    
    super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus); 
    DefaultMutableTreeNode nodo = (DefaultMutableTreeNode)value; 
    TreeNode t = nodo.getParent(); 
    if(t!=null){ 
     setIcon(root); 
    } 
    return this; 
} 

彼の名前を使わずにノード?サブクラスのコードはそのままで、すべてのノードを同じアイコンで設定し、jtreeのノードを選択するたびにgetTreeCellRendererComponentが実行されますが、これは必要ありません。

答えて

15

あなたは、任意のカスタムレンダラなしJTreeノードのアイコンのデフォルトのUIの値を変更することができます。

URL resource = logaff.class.getResource(IMAGE); 
Icon icon = new ImageIcon(resource); 

UIManager.put("Tree.closedIcon", icon); 
UIManager.put("Tree.openIcon", icon); 
UIManager.put("Tree.leafIcon", icon); 

か、次のようなものを使用します。

@Override 
public Component getTreeCellRendererComponent(JTree tree, 
    Object value, boolean selected, boolean expanded, 
    boolean leaf, int row, boolean hasFocus) { 
     super.getTreeCellRendererComponent(tree, value, selected,expanded, leaf, row, hasFocus); 
     DefaultMutableTreeNode nodo = (DefaultMutableTreeNode) value; 
     if (tree.getModel().getRoot().equals(nodo)) { 
      setIcon(root); 
     } else if (nodo.getChildCount() > 0) { 
      setIcon(parent); 
     } else { 
      setIcon(leaf); 
     } 
     return this; 
} 

またについてrendering mechanismをお読みください。

+0

WOW!私は2週間の答えを探している、友人と私はたくさんの読書をしていましたが、今回私たちは混乱しました。単純なコードを表示するには、コードは完璧です、私はそれをテストし、後でそれがどのように動作するかを教えます。 ありがとうございました! – Vlad

+0

うん!それは完璧に動作します!再度、感謝します!!! – Vlad

1

これは短時間で使用できます。 「ツリー」は私のJTreeコンポーネントです。

DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree.getCellRenderer(); 
Icon closedIcon = new ImageIcon("closed.png"); 
Icon openIcon = new ImageIcon("open.png"); 
Icon leafIcon = new ImageIcon("leaf.png"); 
renderer.setClosedIcon(closedIcon); 
renderer.setOpenIcon(openIcon); 
renderer.setLeafIcon(leafIcon);  
関連する問題