我有代码 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/