Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有mousemotionlistener的JTree_Java_Swing_Tooltip_Jtree_Mouse Listeners - Fatal编程技术网

Java 带有mousemotionlistener的JTree

Java 带有mousemotionlistener的JTree,java,swing,tooltip,jtree,mouse-listeners,Java,Swing,Tooltip,Jtree,Mouse Listeners,我有一个JTree,我想在用户将鼠标悬停在树节点上时向用户显示一些描述 我从文档中看到,我们可以使用MouseMotionListener来实现这一点。但是,如何获得鼠标移动到的节点的值呢 任何指针都非常有用。从MouseEvent获取节点值的一种方法是获取鼠标x,y位置的TreePath,并从该路径获取最后一个路径组件 这可能看起来像这样: import javax.swing.tree.TreePath; import java.awt.event.MouseEvent; import ja

我有一个
JTree
,我想在用户将鼠标悬停在树节点上时向用户显示一些描述

我从文档中看到,我们可以使用
MouseMotionListener
来实现这一点。但是,如何获得鼠标移动到的节点的值呢


任何指针都非常有用。

MouseEvent
获取节点值的一种方法是获取鼠标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)
        {
            ...                
        }
});

但是,如果您希望将描述显示为工具提示,那么这对您来说可能会更好。

请查看
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;
}

因此,尊重渲染器指定的工具提示文本。

我想为每个节点显示工具提示。为此,我需要确定悬停在哪个节点上以及如何显示工具提示。您有什么建议吗?函数
path.getLastPathComponent()
将返回悬停在其上的节点。
JTree
TreeCellRenderer
为节点提供工具提示。按照文章末尾的链接查看如何使用
TreeCellRenderer
指定工具提示。