我从这里获取的代码允许通过单击行上的任意位置来选择 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); } }