Chinaunix

标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!! [打印本页]

作者: 末代地主    时间: 2005-08-01 11:04
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
我搞了一个JTree,子结点是人名,我想在子结点男性同女性的图标不一样,请问可以实现吗?
DefaultTreeCellRenderer render=new DefaultTreeCellRenderer();
render.setLeafIcon(new ImageIcon("QQ.jpg");      
jtree.setCellRenderer(render);
我想实现为(但这样是不行的)
if(sex.equals("男")
   render.setLeafIcon(new ImageIcon("QQ_male.jpg");
else
   render.setLeafIcon(new ImageIcon("QQ_female.jpg");
jtree.setCellRenderer(render);
请问有其它方法实现吗?请大家帮帮忙。多谢先!!

作者: 末代地主    时间: 2005-08-01 22:25
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
请那位高手帮忙一下好吗?多谢先了
作者: jinijxta    时间: 2005-08-02 02:38
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
可以,扩展DefaultTreeCellRenderer重写方法getComponent....方法就可以了.
作者: sakulagi    时间: 2005-08-02 07:18
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
应该自己创建一个TreeCellRender,然后重载getTreeCellRendererComponent()方法,在不同的情况下设置不同的leaf icon,然后返回这个TreeCellRender。


  1. import java.awt.Component;
  2. import java.util.Calendar;

  3. import javax.swing.Icon;
  4. import javax.swing.ImageIcon;
  5. import javax.swing.JFrame;
  6. import javax.swing.JTree;
  7. import javax.swing.tree.DefaultTreeCellRenderer;

  8. public class LeafIconTest {
  9.         private JFrame jf = null;

  10.         /**
  11.          * @param args
  12.          */
  13.         public static void main(String[] args) {
  14.                 LeafIconTest lit = new LeafIconTest();
  15.                 lit.test();
  16.         }

  17.         private void test() {
  18.                 jf.show();
  19.         }

  20.         public LeafIconTest() {
  21.                 super();
  22.                 jf = new JFrame("Leaf Icon Test");
  23.                 jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  24.                 jf.setSize(200, 300);
  25.                 jf.getContentPane().add(getJTree());
  26.         }

  27.         private Component getJTree() {
  28.                 JTree jt = new JTree();
  29.                 jt.setCellRenderer(new DefaultTreeCellRenderer() {
  30.                         public Component getTreeCellRendererComponent(JTree tree,
  31.                                         Object value, boolean sel, boolean expanded, boolean leaf,
  32.                                         int row, boolean hasFocus) {
  33.                                 System.out.println("[DEBUG] "
  34.                                                 + Calendar.getInstance().getTime().toGMTString()
  35.                                                 + "  getLeafIcon invoked");
  36.                                 super.getTreeCellRendererComponent(tree, value, sel, expanded,
  37.                                                 leaf, row, hasFocus);
  38.                                 if (leaf) {
  39.                                         setIcon(getLengthIcon(value));
  40.                                 }
  41.                                 return this;
  42.                         }
  43.                 });
  44.                 return jt;
  45.         }

  46.         protected Icon getLengthIcon(Object value) {
  47.                 ImageIcon ii;
  48.                 // We use the length of the string representation of the node to
  49.                 // determine the icon.
  50.                 // In real world, we need to determine this by the
  51.                 // 'male | female' attribute of the tree node, which can be extracted
  52.                 // from the parameter 'value'
  53.                 int length = value.toString().length();
  54.                 if (length == 5 || length == 3) {
  55.                         ii = new ImageIcon("e:/temp/male.jpg");
  56.                 } else {
  57.                         ii = new ImageIcon("e:/temp/female.jpg");
  58.                 }
  59.                 System.out.println(value.toString());
  60.                 return ii;
  61.         }
  62. }
复制代码

作者: 末代地主    时间: 2005-08-02 09:59
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
多谢!!
作者: 末代地主    时间: 2005-08-02 13:10
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
此功能我通过改编后,把它移植到我的程序中,可以到是可以的,但我的程序的性别判断是通过数据库连接来获取的,所以让程序执行变得很慢,在此界面上的其它的一个动画线程受到了很大影响。
作者: sakulagi    时间: 2005-08-02 16:21
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
你的数据库的信息是随时变化的么?
可以考虑作个cache
作者: 末代地主    时间: 2005-08-02 16:30
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
请教一下这位高手,请问怎么作cache.能给一点示例吗?多谢先
作者: sakulagi    时间: 2005-08-02 16:54
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
你的节点的内容随时变化么?还是从数据库取一次就可以了?
你可以把性别信息保存在TableModel里啊?
就不用每次都访问数据库了。
作者: 末代地主    时间: 2005-08-02 17:01
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
我的子结点的名字都是从数据库中获取的,只用一次访问就从数据库中读出子结点名,但当每次单击子结点时都会连接数据库获取子结点的详细信息显示的一个文本框中。
作者: sakulagi    时间: 2005-08-02 21:24
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
建议在第一次访问某个子节点的时候把信息取出来的信息保存在TreeModeL里。这样不用每次都去数据库里取。
作者: 末代地主    时间: 2005-08-02 21:31
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
谢谢,但我不会用TreeModel。能不能给一个实例吗?多谢了!!
作者: sakulagi    时间: 2005-08-03 11:10
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
你现在的数据是怎么取出来的?能看一下你的程序片断么?
作者: 末代地主    时间: 2005-08-03 12:48
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
class AddressList extends JFrame implements TreeSelectionListener,ActionListener
{。。。。。。。
AddressList()
    {。。。。。。。   
     jtree=new JTree(root);   
     。。。。。
     showData();
     DefaultTreeCellRenderer render=new DefaultTreeCellRenderer(); //渲染结点
     render.setLeafIcon(new ImageIcon("QQ.jpg");      
     jtree.setCellRenderer(render);                  
   .。。。。。。      
     setResizable(false);     
    }  
public void showData()
    { try
         {Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"; }
     catch(ClassNotFoundException e11)
         {System.out.println("错误"+e11); }
     try
           {sqlcon=DriverManager.getConnection("jdbcdbc:minm","","";
            sql=sqlcon.createStatement();
            rs=sql.executeQuery("select distinct * from 通讯录表";                  
            while(rs.next())
                 {String n1=rs.getString(1);               
                  String n8=rs.getString(;                              
                  if(n8.equals("高中同学")
                     {DefaultMutableTreeNode t21=new DefaultMutableTreeNode(n1);                  
                      t2.add(t21);                  
                      }
                  else if(n8.equals("大学同学")
                     {DefaultMutableTreeNode t11=new DefaultMutableTreeNode(n1);
                      t1.add(t11);         
                      }
                  else if(n8.equals("初中同学")
                      {DefaultMutableTreeNode t31=new DefaultMutableTreeNode(n1);
                       t3.add(t31);                  
                      }   
                  else if(n8.equals("小学同学")
                      {DefaultMutableTreeNode t41=new DefaultMutableTreeNode(n1);
                       t4.add(t41);                    
                      }
                  else
                      {DefaultMutableTreeNode t51=new DefaultMutableTreeNode(n1);
                       t5.add(t51);                    
                       }                                                                             
                  }              
             }
     catch(SQLException e1){}
    }
public void valueChanged(TreeSelectionEvent e)
    {if(e.getSource()==jtree)
        {dmtn=(DefaultMutableTreeNode)jtree.getLastSelectedPathComponent();
         if(dmtn.isLeaf())
             {try
                 {sqlcon=DriverManager.getConnection("jdbcdbc:minm","","";
                  sql=sqlcon.createStatement();
                  rs=sql.executeQuery("select * from 通讯录表 where 姓名='"+dmtn.toString()+"'";
                  jta.setText("");        
                  while(rs.next())
                     {String n1=rs.getString("姓名");
                      String n2=rs.getString("性别");
                      String n3=rs.getString("QQ");
                      String n4=rs.getString("家庭电话");
                      String n5=rs.getString("固定电话");
                      String n6=rs.getString("移动电话");
                      String n7=rs.getString("所在地址");
                      String n8=rs.getString("关系");
                      String n9=rs.getString("生日");
                      jta.append("显示从数据库中获取的数据......");                                                                  
                      }
                  sqlcon.close();      
                 }
              catch(SQLException e1){}
              }  
         else
             {jscr1.setViewportView(jtree); //还是不能更新
              jta.setText("");
             }      
        }
        //把jtree子结点上的图标设成两种,即男性同女性的头像用不同图标表示,但实现后程序执行变得很慢              
       /*
       if(!(cellRenderered))
         {cellRenderered=true;
          jtree.setCellRenderer(new DefaultTreeCellRenderer()
               {public Component getTreeCellRendererComponent(JTree tree,Object value,
               boolean sel, boolean expanded, boolean leaf,int row, boolean hasFocus)
                 {super.getTreeCellRendererComponent(tree, value, sel, expanded,leaf, row, hasFocus);
                  if(leaf)
                     {ImageIcon ii= new ImageIcon("QQ.jpg");
                      setIcon(ii);                             
                      try
                          {Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
                           sqlcon=DriverManager.getConnection("jdbcdbc:minm","","");
                           sql=sqlcon.createStatement();
                           rs=sql.executeQuery("select distinct * from 通讯录表 where 姓名='"+value.toString()+"'");
                           if(rs.next())
                             {if(rs.getString(2).equals("男"))
                                ii = new ImageIcon("QQ(ll).jpg");
                              else
                                ii = new ImageIcon("QQ(vvv).jpg");
                              }                       
                            sqlcon.close();  
                            }
                        catch(ClassNotFoundException e12)
                            {System.out.println("错误"+e12); }
                        catch(SQLException e1){}
                        setIcon(ii);              
                        }
                   return this;
                  }
                });  
          } */
    }     
public void actionPerformed(ActionEvent e)
    {if(e.getSource()==jmi11)
        {int inserting=JOptionPane.showConfirmDialog
                   (null,"确定退出吗?","Warning",JOptionPane.OK_CANCEL_OPTION);
         if(inserting==JOptionPane.OK_OPTION)
              {System.exit(0);
               }
        }
。。。。
   }
}
作者: 末代地主    时间: 2005-08-03 13:00
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
希望各位能提出宝贵建议!!!!
多谢!!!
作者: sakulagi    时间: 2005-08-03 13:40
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
哦,这样的。你已经在用model了。呵呵。
我的思路。(10天之内没有时间写程序了。工作太忙,抱歉,只能讲个大概)。

不要直接把人名放到TreeNode里。创建一个Contact类。里边既存放name,同时存放性别。然后在创建image的时候,把value转换成Contact类型,然后把性别取出来,就不用访问数据库了。
作者: 末代地主    时间: 2005-08-03 14:47
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
多谢!!
知道怎么做了,非常感激!!
作者: sakulagi    时间: 2005-08-03 15:27
标题: !!请问JTree的子结点图标可以设成两种不同的图像吗?!!
不客气




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2