A VetoableChangeListener is only useful if the class that it registered triggers theChange vet. Most (all? Never encountered one) properties on JComponents and subclasses are not vetoed. In addition, the selection is handled using the SingleSelectionModel, not the component itself.
This model is a hook to support veterinary changes.
- implement a custom model that runs vetoablePropertyChange when the selection changes
- If none of his listeners is objective, continue the change, otherwise do nothing
- set custom model in tabbedPane
- implement a VetoablePropertyChangeListener that contains validation logic
- register vetoableListener for the model
in code, something like
public static class VetoableSingleSelectionModel extends DefaultSingleSelectionModel { private VetoableChangeSupport vetoableChangeSupport; @Override public void setSelectedIndex(int index) { if (getSelectedIndex() == index) return; try { fireVetoableChange(getSelectedIndex(), index); } catch (PropertyVetoException e) { return; } super.setSelectedIndex(index); } private void fireVetoableChange(int oldSelectionIndex, int newSelectionIndex) throws PropertyVetoException { if (!isVetoable()) return; vetoableChangeSupport.fireVetoableChange("selectedIndex", oldSelectionIndex, newSelectionIndex); } private boolean isVetoable() { if (vetoableChangeSupport == null) return false; return vetoableChangeSupport.hasListeners(null); } public void addVetoableChangeListener(VetoableChangeListener l) { if (vetoableChangeSupport == null) { vetoableChangeSupport = new VetoableChangeSupport(this); } vetoableChangeSupport.addVetoableChangeListener(l); } public void removeVetoableChangeListener(VetoableChangeListener l) { if (vetoableChangeSupport == null) return; vetoableChangeSupport.removeVetoableChangeListener(l); } }
source share