# Update JList



## Extractor (28. Nov 2006)

Hallo!

Ich instanziere im c-tor eine JList.


```
String[] user = server.getUserlist();
	    userlist = new JList(user);
            JScrollPane scrollerUserList = new JScrollPane();
            scrollerUserList.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            scrollerUserList.getViewport().setView(userlist);
	    getContentPane().add(scrollerUserList, BorderLayout.EAST);
```


Nun habe ich außerhalb des c-tors eine Methode "receiveMessage". In dieser Methode parse ich einen String.
Wenn nun eine bestimmte Bedingung erfüllt ist, möchte ich die JList updaten bzw. neu instanzieren.


Wie kann ich das machen? Muss ich das Panel komplett neu instanzieren, oder geht das irgendwie einfacher?



```
public void receiveMessage{
if(....){
    //UpdateUserList
}
}
```


Kann mir da jemand helfen?


Gruß Jan


----------



## Beni (28. Nov 2006)

Guck dir das ListModel an. Wenn du ein javax.swing.DefaultListModel anstelle eines Arrays verwendest, geht das mit dem update ganz einfach :wink:


----------



## Extractor (28. Nov 2006)

Hallo!

Wie bekomme ich denn ein String[]-Array in das ListModell?

So geht es nicht: (steht im c-tor)


```
//UserList
            DefaultListModel listModell = new DefaultListModel();
            listModell.addElement(server.getUserlist());    //liefert ein String[]
	    userlist = new JList (listModell);
            
            JScrollPane scrollerUserList = new JScrollPane();
            scrollerUserList.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            scrollerUserList.getViewport().setView(userlist);
	    getContentPane().add(scrollerUserList, BorderLayout.EAST);
```



Und wie mache ich dann das Update?


Schonmal vielen Dank!


Gruß Jan


----------



## Xandro (28. Nov 2006)

Moin,

hinzufügen des Arrays:


```
DefaultListModel dlm = new DefaultListModel();
String[] userlist = server.getUserlist();
for(int i = 0; i < userlist.length(); i++)
{
   dlm.addElement(userlist[i]);
}
```

Für das Update der JList dürfte es dann reichen,
das Model zuzuweisen:


```
jList.setListModel(dlm);
```

Geht aber vielleicht noch einfacher mit dem Update...


----------



## Extractor (28. Nov 2006)

Hallo!

Schonmal vielen Dank!

Aber der Compiler kennt setListModel() nicht.


```
dlm = new DefaultListModel(); 
            String[] user = server.getUserlist(); 
            for(int i = 0; i < user.length; i++) 
            { 
               dlm.addElement(user[i]); 
            } 
            userlist = new JList ();
            userlist.setListModel(dlm);             //Kennt der Compiler nicht!!!
            JScrollPane scrollerUserList = new JScrollPane();
            scrollerUserList.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            scrollerUserList.getViewport().setView(userlist);
	    getContentPane().add(scrollerUserList, BorderLayout.EAST);
```

Gruß Jan


----------



## Xandro (28. Nov 2006)

Tschuldige,

war nicht setListModel(), sondern setModel().


----------



## Extractor (28. Nov 2006)

Hallo!

Also muss ich jetzt in der receiveMessage() Methode, welche sich außerhalb des c-tors befindet nur 
userlist.setModel(dlm);  aufrufen?

Irgendwie geht das noch nicht. Die JList in meiner GUI wird nicht geupdated.
Ich hab mir ma System.out.println(userlist.getModel()); ausgeben lassen. Dort stehen die Strings drin. Aber grafisch in der GUI ist noch kein Update sichtbar.



```
public void receiveMessage(){
if (....){
    userlist.setModel(dlm);  
}
}
```

Gruß Jan


----------



## Beni (28. Nov 2006)

Nein, du musst die neuen Strings (in receiveMessage) dem Model hinzufügen. Das DefaultListModel hat nicht umsonst Methoden wie "addElement" :wink:
Du kannst dort auch alte Strings entfernen, oder gleich ein ganz neues Model machen und der JList übergeben.

Wenn das alles nie einen Effekt hat: bist du sicher, dass du nicht mehrere Instanzen der JList umherschwirren hast? Es nützt nichts, wenn eine unsichtbare JList aktualisiert wird...


----------



## Extractor (28. Nov 2006)

Hallo!

Also ich habe jetz folgendes in die Methode receiveMessage() geschrieben:


```
//UserList aktualisieren
                        dlm = new DefaultListModel(); 
                        String[] user = server.getUserlist(); 
                        for(int i = 0; i < user.length; i++) 
                        { 
                           dlm.addElement(user[i]); 
                        } 
                        userlist.setModel(dlm);
```



Ich habe auch nur eine JList-Instanz.


Und es passiert immer noch nichts in der GUI.

Seltsam!? Warum funzt das noch nicht?


Gruß Jan


----------



## Extractor (29. Nov 2006)

Ich bekomms einfach nicht hin!  :?: 

An was kann es denn noch liegen?


Gruß Jan


----------



## Beni (29. Nov 2006)

Lässt sich ohne weiteren Code nicht sagen, aber hast du Beweise für "Ich habe auch nur eine JList-Instanz."? In 99% aller Fälle ist genau dieser Fehler für solches Verhalten verantwortlich.


----------



## Extractor (29. Nov 2006)

Also im c-tor erzeuge ich EINE JList:


```
//UserList
            dlm = new DefaultListModel(); 
            String[] user = server.getUserlist(); 
            for(int i = 0; i < user.length; i++) 
            { 
               dlm.addElement(user[i]); 
            } 
            userlist = new JList ();
            userlist.setModel(dlm);
            JScrollPane scrollerUserList = new JScrollPane();
            scrollerUserList.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            scrollerUserList.getViewport().setView(userlist);
	    getContentPane().add(scrollerUserList, BorderLayout.EAST);
```



Wenn nun eine Bedingung erfüllt ist, erzeuge ich ein Update:


```
//UserList aktualisieren
                        dlm = new DefaultListModel(); 
                        String[] user = server.getUserlist(); 
                        for(int i = 0; i < user.length; i++) 
                        { 
                           dlm.addElement(user[i]); 
                        } 
                        userlist.setModel(dlm);
```


Das ganze ist eine Art Chat. Wenn ich nun mehrer Chat-Fenster starte, muss jedem Chat-Fenster gesagt werden, dass ein neuer Client gestartet wurde und somit die UserListe updaten

In jedem Client gibt es die Methode receiceMessage(). Wenn nun der Server sagt: "Neuer Client" soll die UserList upgedated werden.


Schonmal vielen Dank!

Gruß Jan


----------



## Beni (29. Nov 2006)

Der Code den du hier zeigst sieht IMHO gut aus, der Fehler wird irgendwo "dazwischen" liegen.
Mach ein KSKB (ein kleines kompilierbares und ausführbares Beispiel).

Übrigens: Beweis dass es funktionieren sollte:

```
package forum;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Beispiel extends JFrame{
    private JList list;
    private DefaultListModel dlm = new DefaultListModel();
    
    public static void main( String[] args ) {
        new Beispiel().setVisible( true );
    }
    
    public Beispiel(){
        list = new JList( dlm );
        JButton button = new JButton( "Test" );
        
        getContentPane().add( new JScrollPane( list ), BorderLayout.CENTER );
        getContentPane().add( button, BorderLayout.SOUTH );
        
        button.addActionListener( new ActionListener(){
            public void actionPerformed( ActionEvent e ) {
                update();
            }
        });
        
        pack();
        setDefaultCloseOperation( EXIT_ON_CLOSE );
    }
    
    public void update(){
        dlm.addElement( (dlm.size()+1) + " Element " + Math.random() );
    }
}
```

Edit: wird dein Konstruktor auch nur einmal ausgeführt? Mit einem "System.out.println" lässt sich das schnell prüfen (es sollte nur eine Ausgabe gemacht werden).


----------



## Extractor (29. Nov 2006)

Hallo!

Habs jetzt hinbekommen!

Bin von dem DefaultListModel wieder zum String [] gewechselt.

Und mit dem Aufruf von...


```
userlist.setListData(server.getUserlist());
```


...mache ich mein Update.


Vielen Dank.



Gruß Jan


----------

