使用MouseListener中的mouseClicked(MouseEvent e)
方法,可以实现鼠标双击事件的处理
 int getClickCount() 
这个方法如果返回值〉=2既是双击。

解决方案 »

  1.   

    谢谢jackkui(长空铸剑) 。
    zhang21cnboy(事了抚衣去,不留身与名) ,你是指我的第一个问题“在JTree节点描述中,用哪个方法可以使鼠标选中的节点项永远改变图标,直到下次再点击。”
    没法做吗?
    这个咋办亚?
      

  2.   

    AllError(错误大全) 兄,呵呵,我了解了,我去试式
      

  3.   

    第一个问题我不知道,但是第二个我做过一点,MouseListener ml = new MouseAdapter() {
         public void mouseClicked(MouseEvent e) {
             int selRow = checkTree.getRowForLocation(e.getX(), e.getY());
             TreePath selPath = checkTree.getPathForLocation(e.getX(), e.getY());
            if(selRow != -1) {
                 if(e.getClickCount() == 1) {
                  //   mySingleClick(selRow, selPath);
                 }
                 else if(e.getClickCount() == 2) {
                     myDoubleClick(selRow, selPath);
                 }
             }
         }
     };
    checkTree.addMouseListener(ml);
    然后再myDoubleClick(int selRow, TreePath selPath)中定义您的动作;
      

  4.   

    谢谢 jackkui(长空铸剑) ,AllError(错误大全) ,第二个问题已解决!不胜感激。
    第一个问题:
    用哪个方法可以使鼠标选中的树节点项永远改变图标,直到下次再点击。我要实现的功能描述如下:
    鼠标多选树结点,点下去改变图标以表示选中,再次点击希望可以恢复回原来图标。
    这末简单的功能Java不会实现不了把?!
      

  5.   

    谢谢, yxlleslie(雪莉) 。鼠标双击事件我也是像您那样实现了。
      

  6.   


    我做了个小实验,不知道是否能满足你说的要求。Application形式的,共用了两个类。其中a.gif,和b.gif为两种状态下的图标。
      说明较少请谅解。如有问题,可继续在线讨论  //第一个类----主类;import javax.swing.UIManager;
    import java.awt.*;public class TreeTest {
      boolean packFrame = false;  //Construct the application
      public TreeTest() {
        TreeTestFrame frame = new TreeTestFrame();
        //Validate frames that have preset sizes
        //Pack frames that have useful preferred size info, e.g. from their layout
        if (packFrame) {
          frame.pack();
        }
        else {
          frame.validate();
        }
        //Center the window
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        if (frameSize.height > screenSize.height) {
          frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
          frameSize.width = screenSize.width;
        }
        frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
        frame.setVisible(true);
      }  //Main method
      public static void main(String[] args) {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception e) {
          e.printStackTrace();
        }
        new TreeTest();
      }
    }
     
    // 第二个类-------Frame窗口  import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;
    import java.util.*;public class TreeTestFrame extends JFrame {
      JPanel contentPane;
      JTree jTree1;
      //Construct the frame
      public TreeTestFrame() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }  //Component initialization
      private void jbInit() throws Exception  {
        contentPane = (JPanel) this.getContentPane();
        contentPane.setDebugGraphicsOptions(0);
        contentPane.setLayout(null);
        this.setSize(new Dimension(400, 300));
        this.setTitle("Frame Title");
        
        LogItemRenderer  LIR=new LogItemRenderer();
        Item checkNode = new Item("Root",0);
        DefaultMutableTreeNode myrootNode = new DefaultMutableTreeNode(checkNode);
        DefaultTreeModel logModel = new DefaultTreeModel(myrootNode);
        jTree1 = new JTree(logModel);
        jTree1.setBounds(new Rectangle(4, 7, 120, 165));
        DefaultMutableTreeNode a=new DefaultMutableTreeNode(new Item("a",0));
        DefaultMutableTreeNode aa1=new DefaultMutableTreeNode(new Item("aa1",0));
        DefaultMutableTreeNode aa2=new DefaultMutableTreeNode(new Item("aa2",0));
        a.add(aa1);
        a.add(aa2);
        myrootNode.add(a);
        DefaultMutableTreeNode b=new DefaultMutableTreeNode(new Item("b",0));
        myrootNode.add(b);
        jTree1.setCellRenderer(LIR);
        jTree1.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
          public void valueChanged(TreeSelectionEvent e) {
            jTree1_valueChanged(e);
          }
        });
        
        contentPane.add(jTree1, null);
      }  //tree selection event
       void jTree1_valueChanged(TreeSelectionEvent e) {      DefaultMutableTreeNode node = (DefaultMutableTreeNode)jTree1.getLastSelectedPathComponent();
     
          TreePath pathnode = (TreePath)jTree1.getLeadSelectionPath();
     
          if (jTree1.isVisible(pathnode)) {
            Item lognode=(Item)node.getUserObject();
             
             if(lognode!=null){
                int i=lognode.getFlag();
                lognode.setFlag(1-i);
                System.out.println(pathnode.toString()+"   "+lognode.getFlag());
              }
          }
        }
     
      //Overridden so we can exit when window is closed
      protected void processWindowEvent(WindowEvent e) {
        super.processWindowEvent(e);
        if (e.getID() == WindowEvent.WINDOW_CLOSING) {
          System.exit(0);
        }
      }
      
      //自定义的cellrenderer
      
      class LogItemRenderer extends DefaultTreeCellRenderer {
       ImageIcon myIcon[];
       int selectmode;
       
       public LogItemRenderer() {
         selectmode=0;
         myIcon = new ImageIcon[2];
         myIcon[0] =new ImageIcon(TreeTestFrame.class.getResource("a.gif" ));
         myIcon[1] =new ImageIcon(TreeTestFrame.class.getResource("b.gif" ));
      
       }   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 );
         
         TreePath treePath = tree.getPathForRow( row );
         int ndx = getIconIndex( treePath );
         if ( ndx>=0 ) setIcon( myIcon[ndx] );     return this;
       }   protected int getIconIndex( TreePath path ) {
         DefaultMutableTreeNode node;
         if ( path != null ) {
           node = (DefaultMutableTreeNode) path.getLastPathComponent();
           if ( node != null ) {
             Item logNode = (Item)node.getUserObject();
             if ( logNode != null )
               return logNode.getFlag();
           }
         }     return -1;
       }
     }
     
    }  //自定义的树节点的对象类型
     class Item{
       String str;
       int flag;
       
       public Item(String str,int flag){
        this.str=str;
        this.flag=flag;
       }
     
       void setFlag(int flag){
         this.flag=flag;
       }
       
        public String toString(){
        return this.str;
       }
       int getFlag(){
         return this.flag;
       }
     }
     
      

  7.   

    yxlleslie(雪莉) ,谢谢你。看过了你的代码,受益匪浅,我还要多多想你学习才是!你的功能满足我的需求,我也进一步作了改进,只是才疏学浅,还有很多有待于学习,总之,谢谢你的帮助,帮了我很大的忙。还有,想请教你一下,Java的技术文档哪有?没有中文的吧?我的电子邮箱是[email protected] 希望多和你交流。
      

  8.   

    本想发给你的,可惜压缩文件有32M,只好你自己去down了
    http://java.sun.com/j2se/1.4.2/download.html