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?
Code:
public void receiveMessage{
if(....){
//UpdateUserList
}
}
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.
Code:
public void receiveMessage(){
if (....){
userlist.setModel(dlm);
}
}
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...
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.
//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:
Code:
//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.
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:
Code:
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).