这是我的解决方案。
在 JTree 子类中:
protected void processMouseEvent(MouseEvent e) {
TreePath selPath = getPathForLocation(e.getX(), e.getY());
try {
fireVetoableChange(LEAD_SELECTION_PATH_PROPERTY, getLeadSelectionPath(), selPath);
}
catch (PropertyVetoException ex) {
// OK, we do not want change to happen
return;
}
super.processMouseEvent(e);
}
然后在树中使用类:
VetoableChangeListener vcl = new VetoableChangeListener() {
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
if ( evt.getPropertyName().equals(JTree.LEAD_SELECTION_PATH_PROPERTY) ) {
try {
<some code logic that has to be satisfied>
} catch (InvalidInputException e) {
throw new PropertyVetoException("", evt);
}
}
}
};
tree.addVetoableChangeListener(vcl);
该机制在尽可能早的地方开始。鼠标动作被截获,将要选择的路径通告给 VetoableChangeListeners。在具体的 VCL 中,检查更改属性,如果是前导选择,则检查否决逻辑。如果需要否决,VCL 会抛出 PropertyVetoException,否则鼠标事件处理将照常进行并进行选择。简而言之,这使得潜在客户选择属性成为受约束的属性。