Swing MVC-Beispiel unklar(ListSelectionListener und ListDataListener)

JavaMeetsBlueJ

Bekanntes Mitglied
Hier erstmal der Code:

Klasse Planetenverwaltung(Model)
Java:
import javax.swing.*;
import javax.swing.event.*;

public class Planetenverwaltung implements ListModel
{
    // die Datenbasis
    private Planet[] planeten = new Planet[9];        
    
    // Index zum Steuern des Array
    int index = 0;
    
    // Listener - wird informiert, wenn die Datenbasis sich ändert
    ListDataListener listener; 

    public Planetenverwaltung()
    {
        planeten[0] = new Planet("Merkur");
        planeten[1] = new Planet("Venus");
        planeten[2] = new Planet("Erde");
        planeten[3] = new Planet("Mars");
        planeten[4] = new Planet("Jupiter");
        planeten[5] = new Planet("Saturn");
        planeten[6] = new Planet("Uranus");
        planeten[7] = new Planet("Neptun");
        planeten[8] = new Planet("Pluto");
    }
        
    public void loeschePluto()
    {
    	  planeten = new Planet[8];    
          planeten[0] = new Planet("Merkur");
          planeten[1] = new Planet("Venus");
          planeten[2] = new Planet("Erde");
          planeten[3] = new Planet("Mars");
          planeten[4] = new Planet("Jupiter");
          planeten[5] = new Planet("Saturn");
          planeten[6] = new Planet("Uranus");
          planeten[7] = new Planet("Neptun");
        
        this.fireContentsChanged(this, 8, 8);
    }
    
    // Methoden der Schnittstelle ListModel
    @Override
    public int getSize()
    {
        return planeten.length;
    }
    
    @Override
    public Planet getElementAt(int index)
    { 
        return planeten[index]; 
    }
    
    @Override
    public void addListDataListener(ListDataListener listener)
    {
        this.listener = listener; 
    }

    @Override
    public void removeListDataListener(ListDataListener listener)
    {
        // in der derzeitigen Implementierung nicht vorgesehen
    }    
    
    // ein Event INTERVAL_REMOVED feuern
    protected void fireIntervalRemoved(Object source, int von, int bis)
    {
        ListDataEvent event = new ListDataEvent(source, ListDataEvent.INTERVAL_REMOVED, von, bis);
        listener.intervalRemoved(event);
    }

    // ein Event INTERVAL_ADDED feuern
    protected void fireIntervalAdded(Object source, int von, int bis)
    {
        ListDataEvent event = new ListDataEvent(source, ListDataEvent.INTERVAL_ADDED, von, bis);
        listener.intervalAdded(event); 
    }
    
    // ein Event CONTENTS_CHANGED feuern
    protected void fireContentsChanged(Object source, int von, int bis)
    {
        ListDataEvent event = new ListDataEvent(source, ListDataEvent.CONTENTS_CHANGED, von, bis);
        listener.contentsChanged(event);
    }
}

Klasse Controller:
Java:
import javax.swing.event.*;
import java.awt.event.*;

public class Controller implements ListSelectionListener, ActionListener
{
    private final GUI view;
    private Planetenverwaltung model;

    public Controller(GUI view, Planetenverwaltung model)
    {
        this.view = view;
        this.model = model;
        view.mainMenu.mnPluto.addActionListener(this);
        view.lstPlaneten.addListSelectionListener(this);
        view.lstPlaneten.setModel(model);
    }    
        
    @Override
    public void actionPerformed(ActionEvent e)
    {
        model.loeschePluto();
        view.mainMenu.mnPluto.setEnabled(false);
    }
    
    @Override
    public void valueChanged(ListSelectionEvent e)
    {
        int index = e.getFirstIndex();
        Planet temp = model.getElementAt(index);
        String titel = temp.toString(); 
        view.fenster.setTitle(titel);
    }
}

Es wird ja in der Klasse Planetenverwaltung das ListModel imlpemetiert. Die überschriebene Methode
Code:
addListDataListener(ListDataListener listener)
erwartet einen ListdataListener, den dann die Klassenvariable
Code:
listener
referenzieren soll. Wo kommt der übergebene ListadataListener her?Von welchem Objekt wird der erzeugt?(irgendwo in der JList?) Da muss es doch einen Bezug zu der JList geben.Gibt es da eine Verbindung zum ListSelectionListener? Das einzige was ich finde ist die Deklaration der Variable listener als ListdataListener. Der ListSelectionListener ist mir jedoch schlüssig, da die implementierende Klasse bzw. Objekte davon einer ist.

Gruß
 
Zuletzt bearbeitet:
Aus JList:
A ListModel can be supplied directly to a JList by way of a constructor or the setModel method. The contents need not be static - the number of items, and the values of items can change over time. A correct ListModel implementation notifies the set of javax.swing.event.ListDataListeners that have been added to it, each time a change occurs. These changes are characterized by a javax.swing.event.ListDataEvent, which identifies the range of list indices that have been modified, added, or removed. JList's ListUI is responsible for keeping the visual representation up to date with changes, by listening to the model.
Das heißt, die JList addet die ListDataListeners zum ListModel damit sie mitkriegt wenn sich das Model ändert.
 

Zurück
Oben