# JList Items hinzufügen



## Shaddow (21. Feb 2008)

Hab schon in einigen Foren gelesen und APIs durchstoebert, aber meine List mach nicht, was ich will ^^ 
Vllt könnt ihr mir ja helfen.

Ich habe eine List ListApplication, die Dateien in einem Ordner ausliest. Je nachdem, welche Datei ich anwähle, soll die zweite Liste ListRequirement andere Daten ausgeben. Soviel zur Theorie.



```
// meine Deklarationen
	private JList ListApplication;
	private JList ListRequirement;
	private DefaultListModel listModel;

        // im des JFrame initialisiere ich:
        ListApplication = new JList(getApplications());
	DefaultListModel listModel = new DefaultListModel();
	ListRequirement = new JList(listModel);

        // getApplications ruft folgende Funktion auf:
	Vector<String> getApplications()
	{
		File FilePath;
		FileChooser = new JFileChooser();
		FileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		FileChooser.showOpenDialog(null);
		
		FilePath = new File(FileChooser.getSelectedFile().getAbsolutePath());
		
	    Vector<String> result = new Vector<String>();
	    
	    for(int i=0; i < FilePath.list().length; i++)
	    	if ((FilePath.listFiles()[i].isDirectory() == true)            && 
	    		(FilePath.listFiles()[i].getName().compareTo("attachedfiles")!=0) &&
	    		(FilePath.listFiles()[i].getName().compareTo("TEMPLATE")!=0)      &&
	    		(FilePath.listFiles()[i].getName().compareTo("pics")!=0))
	    		result.add(FilePath.listFiles()[i].getName());	    
 
	return result;
	}

        // damit bekomme ich direkt meine Dateien in dem ordner
        // jetzt wähle ich eine dieser Dateien aus und per MouseListener soll dann vorerst ein absolut beliebiger,
        // zu testzwecken gewaehlter String in die ListRequirement geschrieben werden.

	public void mouseClicked(MouseEvent e) 
	{	

		listModel.addElement("unfwin");
		ListRequirement = new JList(listModel);

		
	}

       // der mouselistener ist registriert und wird aufgerufen, allerdings erscheint der String nicht in ListRequirement
       // ich habe es mit und ohne neuen Konstruktoraufruf, mit und ohne Repaint und noch so einige andere varianten
       // durhcgetestet, aber es will und will nicht klappen.
```

Idee? ^^


----------



## 0x7F800000 (21. Feb 2008)

sry wenn ich hier was falsches erzähle...   
aber ist es nicht so, dass auf der ContentPane von JFrame irgendeine leere JList angemeldet bleibt, während du in deinem listener die referenz auf diese leere JList mit einer neuen JList überschreibst, die nicht im JFrame erscheint? das sind doch zwei verschiedene JList-Komponenten: eins ist leer und geistert auf dem JFrame herum, das andere ist neu, enthält einträge, erscheint aber nirgendwo...

oder ich versteh den code gar nich  :roll:


----------



## Shaddow (21. Feb 2008)

Ne wieso, ich hab genau zwei Listen:
ListRequirement und ListApplication und eben noch dieses Listmodel im Hintergrund. Beide Listen sind mit dem Jframe verlinkt und werden angezeigt, aber die Veraendeurng von ListRequirement wird nicht uebernommen


----------



## 0x7F800000 (21. Feb 2008)

was heisst denn "veränderung von ListRequirement", du veränderst da doch nichts an der JList, die beim JFrame angemeldet ist, stattdessen erzeugst du eine komplett neue, die nirgendwo zu sehen ist  :?: 


```
// im des JFrame initialisiere ich: 
   ListApplication = new JList(getApplications()); 
   DefaultListModel listModel = new DefaultListModel(); 
   ListRequirement = new JList(listModel);
    /*ALIEN_COMMENT:  so, ich nehme mal an, dass du diese liste mit 
        myFrame.getContentPane().add(ListRequirement)
        in dein Fenster packst. Dieses JList ist nun zu sehen, ist aber leer, stimmts?
    */


/*ALIEN_COMMENT: dann füllst du listModel mit irgendwelchen Einträgen
    und dann irgendwann am hellichten tage mitten in irgendeinem Listener:
*/

ListRequirement = new JList(listModel); 

/*ALIEn_COMMENT: und was hast du jetzt? die referenz auf das JList, das gerade auf dem
   JFrame zu sehen ist, ist überschrieben. Stattdessen hast du jetzt einen vollkommen neuen JList
   mit irgendwelchen einträgen erzeugt, der nirgendwo zu sehen ist. Du packst das ding doch nicht auf
   das Jframe, warum soll da was zu sehen sein? Auf dem JFrame ist immer noch das alte JList ohne einträge zu sehen
   Du hast jetzt mindestens drei verschiedene JList Objekte erzeugt, du hast referenzen nur auf zwei davon 
   gespeichert, und es sind nicht die zwei, die im Fenster zu sehen sind...
*/
```

ich hoffe mal, dass es klarer geworden ist, was ich meine...  :roll:


----------



## Shaddow (21. Feb 2008)

okay das versteh ich, aber wie kann ich denn nun die eintraege in die liste einfügen, die ich auf dem jframe verlinkt habe?


----------



## 0x7F800000 (21. Feb 2008)

*dokumentation aufschlag, 7 sekunden lang herumscroll*  :bae: 

Ich habe irgendwie den Verdacht, dass diese Methoden sich ganz gut eignen könnten:


```
setListData(Object[]) 
setListData(Vector<?>) 
//und vor allem für diesen Fall gut geeignet: 
setModel(ListModel)
```

diese methoden halt bei der bereits erstellten JList aufrufen, und den Inhalt eben ändern, statt eine neue JList zu erzeugen...


----------



## martram (21. Feb 2008)

Andrey hat gesagt.:
			
		

> *dokumentation aufschlag, 7 sekunden lang herumscroll*  :bae:
> 
> Ich habe irgendwie den Verdacht, dass diese Methoden sich ganz gut eignen könnten:
> 
> ...



Oder das ListModel direkt modifizieren - die View (in dem Fall die JList) müsste durch das Model über die Veränderung informiert werden und diese anzeigen. (ggf. noch nen repaint() anhängen)
Das Model neusetzen hat mehrere Nachteile, z.B. das die Selektionen verloren gehen.


----------

