Interface ListModel

melmager

Erfahrenes Mitglied
Ich bekomme einfach das ListModel nicht implementiert

der Compiler meckert immer
LiedList is not abstract and does not override abstract method removeListDataListener(javax.swing.event.ListDataListener)

ich finde den Fehler einfach nicht

Code:
public class LiedList implements TransportNote, ListModel {

// wegen der datenclasse mache ich überhaupt die Interface Implementation
public class SongPart {
        public String sound;
        public ArrayList<NoteData> part;
        public boolean show;

        SongPart (String name) {
            sound = name;
            part = new ArrayList<NoteData>();
            show = false;
        }
    }

// interface implementiert Interface - das allein verwirrt mich enorm aber ok ich mache auch das :

 public class MyListDataListener implements ListDataListener {

    public void contentsChanged(ListDataEvent e) {

    }

    public void intervalAdded(ListDataEvent e) {

    }

    public void intervalRemoved(ListDataEvent e) {

    }
}

// interface ListModel

        public void removeListDataListener(LiedList.MyListDataListener  l) {

        }
           
    	public void addListDataListener(MyListDataListener  l) {
            
        }
        
        
        public SongPart getElementAt(int index) {
            return song.elementAt(index);  
        }
        
        public int getSize() {
            return song.size();   	
        }
       

}

der Compiler erkennt weder die removeListDataListener noch die addListDataListener - normalerweise kennzeichnet der NetBeans die implementierten Sachen, bei den Fällen nicht - warum nicht?
 
Zuletzt bearbeitet:
Hi

du hast als Parameter ja kein ListDataListener, sondern ein MyListDataListener.
Ein MyListDataListener ist zwar ein ListDataListener, aber was ist,
wenn ein ListDataListener kommt, das kein MyListDataListener ist?
 
"ListDataListener l" hatte ich zwar anfangs zwar auch mal gemacht, aber da hatte er es nicht erkannt nu gehts ... warscheinlich weil ich irgenwann mal den import javax.swing.event.*; gemacht habe.

nu siehts so aus :
Code:
 private Vector<ListDataListener> hoereaufmich = new Vector<ListDataListener>();

//snipp

        public void removeListDataListener(ListDataListener  l) {
             hoereaufmich.removeElement(l);   
        }
           
    	public void addListDataListener(ListDataListener  l) {
            hoereaufmich.add(l);        
        }

so erkennt er es .. schon mal ein Schritt weiter :)
 
Zuletzt bearbeitet:
So jetzt habe ich die Übersicht verloren ...

ich möchte einfach mit Jlist eine bestehende Datenliste anzeigen und dort änderungen machen.

ich habe ein Mainclasse wo die Swingoberfläche aufgebaut wird

Code:
PartModus myrender = new PartModus();
jListParts = new javax.swing.JList();
jListParts.setCellRenderer(myrender);
jListParts.setModel(lied);

jListParts.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);

jListParts.setName("jListParts"); // NOI18N
jListParts.addListSelectionListener(lied);
jScrollPane1.setViewportView(jListParts);

da erzeuge ich auch mein Classe die für meine Datenliste zuständig ist
Code:
LiedList lied = new LiedList();

meine Classe die für die Daten zuständig ist ,stellt über ListModel die Daten zur verfügung und reagiert auf ein Klick in der liste über ListSelectionListener.

Code:
public class LiedList implements TransportNote, ListModel,ListSelectionListener {

public class SongPart {
        public String sound;
        public ArrayList<NoteData> part;
        public boolean show;

        SongPart (String name) {
            sound = name;
            part = new ArrayList<NoteData>();
            show = false;
        }
    }

 private Vector<SongPart> song = new Vector();
 //die liste für die Listener  die sich anmelden
 private Vector<ListDataListener> hoereaufmich = new Vector<ListDataListener>();

// interface ListModel 
    public void removeListDataListener(ListDataListener  l) {
         hoereaufmich.removeElement(l);
    }
           
    public void addListDataListener(ListDataListener  l) {
        hoereaufmich.add(l);
    }
       
     public SongPart getElementAt(int index) {
          return song.elementAt(index);
     }
        
     public int getSize() {
         return song.size();   	
     }
// interface ListSelectionListener
    public void valueChanged(ListSelectionEvent ev) {
        if (!ev.getValueIsAdjusting()) {
            for (int lo=ev.getFirstIndex();lo <= ev.getLastIndex(); lo++) {
                if (lsm.isSelectedIndex(lo)) {
                    song.get(lo).show = !song.get(lo).show; 
                }  
            }
            
        }
    }

im moment grüble ich über den lsm nach - in den beispielen die ich gefunden habe
ist sowas zu finden
Code:
ListSelectionModel lsm = (ListSelectionModel)e.getSource();

die zeile wird mir aber um die Ohren gehauen ... muss ich echt noch das Interface ListSelectionModell einarbeiten um zu ermitteln welche Eintrag angeklickt wurde ?

Ich brauche nur den Index um den Boolean Wert in den Daten ändern zu können

Die PartModus Classe ist übrigens ein JPanel mit einer Checkbox die mir den Zustand des Booleanwertes SongPart.show anzeigt

sinn und zweck der Übung ist diesen Zustands über die Liste einfach Wechseln zu lassen ....

ich denke ich habe mich verrannt :-(
 
Zuletzt bearbeitet:
Alternative: So arbeite ich prinzipiell mit JList's,...

Code:
public class ArtifactSearchResultListDataModel extends AbstractListModel {
	private static final long serialVersionUID = 4084220113386062218L;
	private List<ArtifactSearchResult> searchResults;

	public ArtifactSearchResultListDataModel(List<ArtifactSearchResult> inSearchResults) {
		searchResults = inSearchResults;
	}

	@Override
	public Object getElementAt(int index) {
		return searchResults.get(index);
	}

	@Override
	public int getSize() {
		return searchResults.size();
	}
}

Verwendet wird's dann so:
Code:
JList searchResults = new JList();
...
searchResults.setModel(new ArtifactSearchResultListDataModel(searchResults));

Jetzt kommt der ListSelectionListener
Code:
this.searchResults.addListSelectionListener(new ListSelectionListener() {
	@Override
	public void valueChanged(ListSelectionEvent e) {
		System.out.println("Value changed, selected item: "
				+ ArtifactSearchView.this.searchResults.getSelectedValue().getClass());
	}
});
mit e.getSelectedValue kommst du direkt an das Object, welches in der Liste drin ist.

Gruss
slowy
 
Danke das hat mich auf die Spur gebracht

Kleiner Wehrmutstropfen:
den gleichen Eintrag 2 mal hintereinander bekommt valueCanged leider nicht mit

its not a bug its a feature :)
 
Zuletzt bearbeitet:
Zurück