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

Posted

技术标签:

【中文标题】JTree 通过单击行上的任意位置选择节点【英文标题】:JTree select node by clicking anywhere on the row 【发布时间】:2012-06-10 00:40:28 【问题描述】:

我有代码taken from here,它允许通过单击行上的任意位置来选择 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() nearestRowBounds.getX() && 最接近行

【问题讨论】:

【参考方案1】:

使用MouseEvent 的修饰键信息。更多信息请见MouseEvent#getModifiersEx

【讨论】:

谢谢,但它有点依赖于平台,有没有更好的方法? 它只是依赖于平台,因为它需要一个带有键盘的平台......【参考方案2】:

PS:监听器注册有bug

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

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

快速修复可能是先删除它,如果启用则添加它

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

【讨论】:

以上是关于JTree 通过单击行上的任意位置选择节点的主要内容,如果未能解决你的问题,请参考以下文章

通过使用纯Javascript单击页面上的任意位置来关闭元素

Java程序,JTree获取节点ID

jQuery单击gridview行上的选择按钮

在java中如何响应单击JTree树中一个节点?

更改 Nimbus LaF 处理 JTree 节点突出显示的方式

jqGrid 多选 - 仅使用复选框限制行的选择