Wanneer je een eindeloze lus hebt in een ChangeListener()

Het heeft me toch een ruime hoeveelheid aan tijd gekost, daarom even het volgende, iets wat technischer item over Java en ChangeListener().

Toen ik met een ChangeListener() bezig was, die luisterde bij het verwisselen van tabs, stootte ik op het probleem dat de inhoud van elke tab volledig zou moeten vernieuwd worden. Dit betekent dat het JComponent dat meegegeven werd aan een JTabbedPane volledig opnieuw zou moeten gegenereerd worden en dat de tab dus verwijderd moet worden om vervolgens op dezelfde index terug in te voegen.

Het probleem stelde zich wanneer er een removeTabAt() aangeroepen werd omdat deze opnieuw een stateChanged() triggert terwijl er reeds een ChangeEvent actief was. Dit resulteerde in een oneindige lus. Na advies op het Sun forum werd mij de volgende oplossing aangereikt die ik graag met jullie wens te delen.

Er diende een flag toegevoegd te worden in de listener, in dit geval alreadyListening, om na te gaan of stateChanged reeds operatief is. Zo ja, dan mag er geen loadTab() uitgevoerd worden.

Hieronder de implementatie voor de ChangeListener():


tabbedPane.addChangeListener(new
ChangeListener() {
  public void stateChanged(ChangeEvent event) {
     if(!alreadyListening) {
       alreadyListening = true;
       int n = tabbedPane.getSelectedIndex();
       loadTab(n);
      alreadyListening = false;
    }
  }
});

De implementatie voor loadTab() ziet er als volgt uit:


private void loadTab(int n) {
  tabbedPane.removeTabAt(n);
  JComponent component = createComponent();
  tabbedPane.insertTab("Someting",  icon, component, "Does nothing", n);
  tabbedPane.setSelectedIndex(n);
}

Let vooral dat ik in laatste stap een setSelectedIndex() aanroep op het JTabbedPane-object om de pointer terug op waarde n te plaatsen in plaats van de automatische n+1.

Leave a Reply

Your email address will not be published. Required fields are marked *