我有一个实现多选逻辑的JTree.
当我按下鼠标+ Ctrl键进行所有选择时,这非常有用.如果用户在按下Ctrl键的情况下进行选择,则会破坏我的逻辑.
我真的不明白为什么它会中断但我认为可能的解决方案是始终指示TreeSelectionModel已按下Ctrl键进行选择.
你会建议什么?
我想我找到了解决方案
您将需要扩展JTree和DefaultTreeSelectionModel.
JTree相关方法:
///////////////////////////////////////////////////// ///////////////////////////////////////////////////// /// Implement selection using "adding" only logic. // ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// @Override public void setSelectionPath(TreePath path) { System.out.println("MLDebugJTree: setSelectionPath(" + path + ")"); addSelectionPath(path); return; //super.setSelectionPath(path); } @Override public void setSelectionPaths(TreePath[] paths) { System.out.println("MLDebugJTree: setSelectionPaths(" + paths + ")"); addSelectionPaths(paths); return; } @Override public void setSelectionRow(int row) { System.out.println("MLDebugJTree: setSelectionRow(" + row + ")"); addSelectionRow(row); return; //super.setSelectionRow(row); } @Override public void setSelectionRows(int[] rows) { System.out.println("MLDebugJTree: setSelectionRows(" + rows + ")"); addSelectionRows(rows); return; //super.setSelectionRows(rows); }
DefaultSelectionModel相关方法:
package com.ml.tree2.model.impl; import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.TreePath; public class MLTreeSelectionModel extends DefaultTreeSelectionModel { private static final long serialVersionUID = -4270031800448415780L; @Override public void addSelectionPath(TreePath path) { // Don't do overriding logic here because addSelectionPaths is ultimately called. super.addSelectionPath(path); } @Override public void addSelectionPaths(TreePath[] paths) { if(paths != null) { for(TreePath path : paths) { TreePath[] toAdd = new TreePath[1]; toAdd[0] = path; if (isPathSelected(path)) { // If path has been previously selected REMOVE THE SELECTION. super.removeSelectionPaths(toAdd); } else { // Else we really want to add the selection... super.addSelectionPaths(toAdd); } } } }
HTH.