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