1

从这里获取的代码允许通过单击行上的任意位置来选择 JTree 行。它在单行选择模式下工作正常。但是,我不确定如何修改它以处理多行选择。如何区分用户进行多项选择时的情况(例如,在鼠标左键单击一行时按住 shift 或 control 按钮)?

导入 java.awt.Rectangle;
导入 java.awt.event.MouseAdapter;
导入 java.awt.event.MouseEvent;
导入 java.awt.event.MouseListener;

导入 javax.swing.JFrame;
导入 javax.swing.JTree;
导入 javax.swing.SwingUtilities;
导入 javax.swing.tree.DefaultMutableTreeNode;
导入 javax.swing.tree.TreeNode;


@SuppressWarnings("串行")
公共类 NavTree 扩展 JTree {

    私有布尔 fWholeRowSelectionEnabled;
    私有 MouseListener fRowSelectionListener;
    最终的导航树 fThis;

    公共导航树(树节点根节点){
        超级(根节点);
        f这=这;
        在里面();
    }
    公共导航树(){
        f这=这;
        在里面();
    }

    私人无效初始化(){
        //setCellRenderer(new NavTreeCellRenderer());
        fRowSelectionListener = new MouseAdapter() {

            公共无效鼠标按下(鼠标事件e){
                if (SwingUtilities.isLeftMouseButton(e)) {
                    int 最近行 = fThis.getClosestRowForLocation(
                            e.getX(), e.getY());
                    矩形最接近行边界 = fThis.getRowBounds(closestRow);
                    if(e.getY() >= mostRowBounds.getY() &&
                            e.getY() < 最近行边界.getY() +
                            最近的RowBounds.getHeight()) {
                        if(e.getX() > nearestRowBounds.getX() &&
                                最接近行 < fThis.getRowCount()){

                                                    fThis.setSelectionRow(closestRow);
                                                }

                    } 别的
                        fThis.setSelectionRow(-1);
                }
            }

        };
        setWholeRowSelectionEnabled(true);
    }

    公共无效setWholeRowSelectionEnabled(布尔wholeRowSelectionEnabled){
        fWholeRowSelectionEnabled = WholeRowSelectionEnabled;
        如果(fWholeRowSelectionEnabled)
            addMouseListener(fRowSelectionListener);
        别的
            removeMouseListener(fRowSelectionListener);
    }

    公共布尔 isWholeRowSelectionEnabled() {
        返回 fWholeRowSelectionEnabled;
    }

    公共静态无效主要(字符串[]参数){
        JFrame 框架 = 新的 JFrame();
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        root.add(new DefaultMutableTreeNode("孩子 1"));
        root.add(new DefaultMutableTreeNode("Child 2"));
        root.add(new DefaultMutableTreeNode("Child 3"));
        导航树树 = 新导航树(根);
        框架。添加(树);
        frame.setSize(200, 300);
        frame.setVisible(true);
    }
}
4

2 回答 2

3

使用 . 的修饰键信息MouseEvent。查看MouseEvent#getModifiersEx更多信息

于 2012-06-06T06:00:56.090 回答
1

PS:监听器注册包含一个bug

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

将该属性设置wholeRowSelectionEnabledtrue应该只注册一次侦听器。true如果该属性设置为多次,您的代码将一次又一次地添加侦听器。我的意思是属性设置器应该是幂等的。

快速修复可能是先将其删除并在启用时添加它

public void setWholeRowSelectionEnabled(boolean wholeRowSelectionEnabled) {
    removeMouseListener(fRowSelectionListener);
    fWholeRowSelectionEnabled = wholeRowSelectionEnabled;
    if (fWholeRowSelectionEnabled)
        addMouseListener(fRowSelectionListener);
}
于 2017-04-19T11:59:50.640 回答