這是我的解決方案。
在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,否則,鼠標事件處理將照常進行並進行選擇。 總之,這使得鉛選擇屬性成爲約束屬性。
這是理想的方法,IMO – 2008-11-04 11:14:54
也許是做那麼最好的方式。 – cagcowboy 2008-11-04 11:19:48