java - JTree 通过单击行上的任意位置来选择节点

标签 java swing jtree

我有代码 taken from here这将允许通过单击行上的任意位置来选择 JTree 行。它在单行选择模式下工作正常。但是,我不确定如何修改它以处理多行选择。当用户进行多项选择时(例如,在按住 Shift 或控制按钮的同时用鼠标左键单击一行),我如何区分这种情况?

import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;


@SuppressWarnings("serial")
public class NavTree extends JTree {

    private boolean                 fWholeRowSelectionEnabled;
    private MouseListener           fRowSelectionListener;
    final NavTree                   fThis;

    public NavTree(TreeNode rootNode) {
        super(rootNode);
        fThis = this;
        init();
    }
    public NavTree() {
        fThis = this;
        init();
    }

    private void init() {
        //setCellRenderer(new NavTreeCellRenderer());
        fRowSelectionListener = new MouseAdapter() {

            public void mousePressed(MouseEvent e) {
                if (SwingUtilities.isLeftMouseButton(e)) {
                    int closestRow = fThis.getClosestRowForLocation(
                            e.getX(), e.getY());
                    Rectangle closestRowBounds = fThis.getRowBounds(closestRow);
                    if(e.getY() >= closestRowBounds.getY() && 
                            e.getY() < closestRowBounds.getY() + 
                            closestRowBounds.getHeight()) {
                        if(e.getX() > closestRowBounds.getX() && 
                                closestRow < fThis.getRowCount()){

                                                    fThis.setSelectionRow(closestRow);
                                                }

                    } else
                        fThis.setSelectionRow(-1);
                }
            }

        };
        setWholeRowSelectionEnabled(true);
    }

    public void setWholeRowSelectionEnabled(boolean wholeRowSelectionEnabled) {
        fWholeRowSelectionEnabled = wholeRowSelectionEnabled;
        if (fWholeRowSelectionEnabled)
            addMouseListener(fRowSelectionListener);
        else
            removeMouseListener(fRowSelectionListener);
    }

    public boolean isWholeRowSelectionEnabled() {
        return fWholeRowSelectionEnabled;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        root.add(new DefaultMutableTreeNode("Child 1"));
        root.add(new DefaultMutableTreeNode("Child 2"));
        root.add(new DefaultMutableTreeNode("Child 3"));
        NavTree tree = new NavTree(root);
        frame.add(tree);
        frame.setSize(200, 300);
        frame.setVisible(true);
    }
}

最佳答案

使用MouseEvent 的修饰键信息。参见 MouseEvent#getModifiersEx了解更多信息

关于java - JTree 通过单击行上的任意位置来选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10906749/

相关文章:

java - JTree:如何添加节点的属性作为自己的叶子?

java - 没有找到类 “java.util.concurrent.CompletableFuture”

java - 从 4.2.0.RC3 升级到 4.2.0.RELEASE 时出现 Spring Async 问题

java - Java 7 中的已知问题

java - 如何刷新 JComboBox 数据?

java - TreeCellRenderer 中的标签宽度不正确

java - JTree、setUserObject()、toString()

java - 如何使用Libcore.os设置环境变量

Java 7,使用 HTML 格式标签时按钮文本的颜色

java - 使用 Swing 的 JTextField 在 Java 中打印屏幕