java - 将 MouseListener 与 JTree 结合使用

标签 java swing mouseevent jtree mouselistener

我正在使用 MouseListener 来检测对 JTree 项目的双击。该JTree 位于JScrollPane 中。当我检测到双击(MouseEvent)时,我从 JTree 获取单击位置的路径。大多数时候,这工作得很好。

现在,如果我双击带有子节点的(折叠的)节点,该节点将展开,因此滚动 Pane 将向下滚动。当我尝试从单击位置获取树路径时,JTree 会查看当前(滚动) View 并返回错误的项目,因为单击位置引用前一个 View (未滚动)。

有人知道如何解决这个问题吗?下面,我将附上一个示例来演示该问题。


package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class TestMain extends JDialog implements MouseListener {

    protected final JTree tree;

    public TestMain() {
        tree = new JTree(getRootNode());
        tree.addMouseListener(this);

        JScrollPane pane = new JScrollPane(tree);
        pane.setPreferredSize(new Dimension(250, 300));

        getContentPane().add(pane, BorderLayout.CENTER);
        pack();
    }

    private TreeNode getRootNode() {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");

        for (int i = 0; i < 10; i++) {
            root.add(new DefaultMutableTreeNode("Node " + i));
        }

        DefaultMutableTreeNode sub = new DefaultMutableTreeNode("Sub");
        root.add(sub);

        for (int i = 0; i < 10; i++) {
            sub.add(new DefaultMutableTreeNode("Sub " + i));
        }

        return root;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
            TreePath path = tree.getPathForLocation(e.getX(), e.getY());
            if (path != null) {
                System.out.println(path.getLastPathComponent().toString());
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    public static void main(String[] args) {
        JDialog dialog = new TestMain();
        dialog.setVisible(true);
    }
}

最佳答案

我建议您使用JTree.getSelectionPath().getLastPathComponent(),因为它不会在滚动时改变。

关于java - 将 MouseListener 与 JTree 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418971/

相关文章:

java - 使用鼠标和图形缩放

windows - 如何检测 Delphi FMX Windows 窗体中的鼠标后退和前进按钮?

image - 如何通过绘制边界框(或多边形)从图像中裁剪多个对象?

java - 解释警告 : non-varargs call of varargs method with inexact argument type for last parameter

java - 通过 jdbc 通过准备好的语句传递 SQL 命令时出错

Java swing 错误 "' void' 此处不允许类型“

javascript - 为什么 _.delay 将我的 e.type 从 mouseenter 变为 mouseover

java - 如何提取具有 ID 但没有子值的子元素的值?

java - 使用 FTP URL 调用 FileSystemManager.resolveFile 时无法更改到工作目录 "/"

java - 如何正确触发 `fireTableDataChanged`