2012-10-22 71 views
2

我有一個JTree,我想向用戶展示一些描述,當他將鼠標懸停在樹節點上時。JTree與mousemotionlistener

我從文檔中看到,我們可以使用MouseMotionListener。但是,我怎樣才能獲得鼠標移動到的節點的值?

任何指針都會非常有用。以獲得從MouseEvent的節點的值

回答

2

一種方法是獲得用於x,鼠標的y位置一個TreePath並從該路徑中讀取最後路徑組件。

這可能是這個樣子:

import javax.swing.tree.TreePath; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JTree; 
... 

final JTree tree = new ... 
tree.addMouseMotionListener(new MouseMotionListener() { 

     @Override 
     public void mouseMoved(MouseEvent e) 
     { 
      TreePath path = tree.getPathForLocation(e.getX(), e.getY()); 
      if(path == null || path.getLastPathComponent() == null) 
      { 
       return; 
      } 

      Object nodeHoveredOver = path.getLastPathComponent(); 
      System.out.println(path.getLastPathComponent()); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) 
     { 
      ...     
     } 
}); 

但是,如果你想顯示你的描述作爲一個提示,然後該this solution可能更好地爲你。

+0

我想爲每個節點顯示一個工具提示。爲此,我需要確定哪些節點被盤旋,以及如何顯示工具提示。您有任何建議嗎? – bharz629

+0

函數'path.getLastPathComponent()'將返回被懸停的節點。 JTree的'TreeCellRenderer'提供了節點的工具提示。按照帖子末尾的鏈接查看如何使用'TreeCellRenderer'來指定工具提示。 – cyon

1

看看在JTree#getTooltipText實現:

public String getToolTipText(MouseEvent event) { 
    String tip = null; 

    if(event != null) { 
     Point p = event.getPoint(); 
     int selRow = getRowForLocation(p.x, p.y); 
     TreeCellRenderer  r = getCellRenderer(); 

     if(selRow != -1 && r != null) { 
      TreePath  path = getPathForRow(selRow); 
      Object  lastPath = path.getLastPathComponent(); 
      Component rComponent = r.getTreeCellRendererComponent 
       (this, lastPath, isRowSelected(selRow), 
       isExpanded(selRow), getModel().isLeaf(lastPath), selRow, 
       true); 

      if(rComponent instanceof JComponent) { 
       //... 

       tip = ((JComponent)rComponent).getToolTipText(newEvent); 
      } 
     } 
    } 
    // No tip from the renderer get our own tip 
    if (tip == null) { 
     tip = getToolTipText(); 
} 
    return tip; 
} 

,以便通過渲染器指定的提示文本受到尊重。