# JList Refresh



## deichblach (23. Feb 2004)

Hi,
Ich habe folgendes Problem:
Ich will einen Chat mit Userliste machen, die Nicknames werden alle auf dem Server in einem Vector gespeichert, und allen usern geschickt falls sie sich verändert. Der Vector wird dann beim client in einer JList dagestellt. Jetzt habe ich allerdings das problem, das die Liste nicht verändert. Das heißt wenn ich jlist.setListData(meinVector) aufrufe passiert auf der Oberfläche nichts, die alte Liste bleibt angezeigt. Wenn ich jetzt allerdings einen neuen Client starte, zeigt er eine andere JList an als der erste Client:
    JList 1. Client
        User1
    JList 2. Client
        User 1
        User 2
und das zur gleichen Zeit obwohl die Liste von User1 == der Liste von User2 sein muss, da der Vector der liste ja vom Server empfangen wurde.

Vielleicht kann mir jemand von euch helfen, wie ich dieses Problem in den Griff bekomme, ich weiß inzwischen keinen rat mehr.

Gruß deichblach


----------



## Illuvatar (24. Feb 2004)

Bei mir funktioniert JList.setData (Vector) perfekt. ???:L 
Prüfe mal, ob die Daten im Vektor stimmen bzw., ob Client 1 wirklich eine aktualisierte Liste mit Client2 empfängt.

PfM


----------



## deichblach (24. Feb 2004)

habe ich gerade gemacht, irgendwie empfängt nur der letzte Client die aktuelle liste obwohl der Server allen die aktuellste Liste schickt, der Server sendet korrekt.
ich weiß irgendwie auch nicht mehr weiter...


----------



## deichblach (24. Feb 2004)

vielleicht hilft jemanden ja der Quellcode des Clienten.

```
Object sobject=null;;
public amSlauschen()
{
	super("AmServerLauschen");
}
public void run()
{
	try
	{
		String msg;
		while(true)
		{
			sobject=null;
			sobject=DeichClient.in.readObject();
			if(sobject instanceof String)
			{
                                                        //Behandlung von Strings
			}
			else if(sobject instanceof Vector)
			{
			    ClientFrame.liste.setListData((Vector) sobject);
			}
		}
	}
	catch(Exception e)
	{
		System.out.println("Fehler beim Lauschen: "+e.toString());
	}
}
```


----------



## Illuvatar (24. Feb 2004)

Wenn sich der zweite Client beim Server anmeldet, müsste doch der Server seinen Vector aktualisieren und an alle Clients (also Client 1) schicken. Machst du das so oder ganz anders?


----------



## deichblach (24. Feb 2004)

genau so mache ich das. deswegen weiß ich auch nicht warum das nicht funzt.

```
Object object=in.readObject();
if(object instanceof String)
{
    line=object.toString();
    if(firsttime)
    {
        for(int i=0; i<line.length();i++)
        {
                if(line.charAt(i)==32)
                {
                    name=(String)line.subSequence(1,i);
                    DeichServer.namen.addElement(name);
                    DeichServer.Broadcast("NeueListe"+name+"in");
                    firsttime=false;
                    break;
                }
        }
    }
}
```
und..

```
public static void Broadcast(String msg)
{
    System.out.println(msg);
    ServerLauschen clien;
    for(int i=0;i<alle.size();i++)
    {
        clien=(ServerLauschen) alle.elementAt(i);
        try
        {
            if(msg.startsWith("NeueListe"))
            {
                boolean in;
                String nick;
                if(msg.endsWith("out"))
                {	
                    nick=(String)msg.subSequence(9,msg.length()-3);
                    in=false;
                    clien.out.writeObject("["+nick+" hat den Chat verlasen]");
                }
                else
                {
                    nick=(String)msg.subSequence(9,msg.length()-2);
                    in=true;
                    clien.out.writeObject("["+nick+" betritt den Chat]");
                }
                System.out.println(namen.toString());
                clien.out.writeObject(namen);
            }
            else
                clien.out.writeObject(msg);
        }
        catch(Exception e)
        {
            System.err.println("hmmm");
        }
    }
}
```
wobei "namen" der Vector mit den Nicknames ist, welcher nachher beim Clienten in der JListe angezeigt werden soll


----------



## Beni (24. Feb 2004)

Was Du verwenden kannst ist ein ListModel.
P.S. da gibt es ein paar vorgefertigte, musst dich mal durch die API klicken.
P.P.S.: Tutorial

mfg Beni


----------



## deichblach (24. Feb 2004)

erstmal danke,
aber ich würde es mir wohl gerne bequem machen, deswegen habe ich auch n Vector benutzt. Ich will nicht wenn irgend einer ausn channel rausgeht erstmal suchen wer überhaupt weg ist und dann in diesem ListModel die neuen daten eintragen.
Geht das denn nicht vielleicht auch ohne? Das Problem liegt ja irgendwo bei dem Empfangen, denn die Daten wurde ja richtig gesendet, aber irgendwie falsch empfangen.


----------



## Illuvatar (24. Feb 2004)

deichblach hat gesagt.:
			
		

> denn die Daten wurden ja richtig gesendet




Bist du dir da sicher?
Ich sehe keine Stelle, an der du namen.addElement (nick) bzw. namen.removeElement (nick) machst.

PfM


----------



## deichblach (24. Feb 2004)

???
guck dir mal den ersten quelltext an.
DeichServer.namen.addElement(name);
*G*
der remove Befehl steht halt nur beim schließen der verbindung, deswegen habe ich den garnicht aufgeführt


----------



## Beni (24. Feb 2004)

@deichbach
Sag mir bitte mal, was an dem hier unbequem ist?

mfg Beni


----------



## deichblach (24. Feb 2004)

ich sende einen Vector mit all meinen Namen in der Liste, falls sich etwas verändert, vom Server zu allen Clienten.
Der Client übernimmt einfach den Vector mit liste.setListData(meinVector).
Wenn ich jetzt das List Modell nehmen würde müsste ich jedesmal beim client suchen ob sich etwas verändert hat und wenn ja, was.
Ich weiß nicht, aber ich finde die ist ein bißchen kompliziert, aber wenn es nicht anders geht dann muss ich das wohl so machen.


----------



## Beni (24. Feb 2004)

ach so...
*jetzt besser versteh*

Kannst Du mir sagen ob diese List gefüllt wird?
	
	
	
	





```
package testing;

import javax.swing.*;
import java.util.*;

public class ListTest3 extends JFrame {
  private JList list;
  private Vector elements = new Vector();

  public ListTest3() {
    list = new JList( elements );
    getContentPane().add( new JScrollPane( list ));
    setBounds( 10, 10, 300, 300 );
    setDefaultCloseOperation( EXIT_ON_CLOSE );

    setVisible( true );

    for( int i = 0; i < 120 ; i++ ){
      try {
        Thread.sleep( 1000 );
      } catch (InterruptedException ex) {}

      elements.add( String.valueOf( i ) + ": " + Math.random());
      System.out.println( i + ": neue Daten" );
      list.setListData( elements );
    }
  }
}
```

Wenn nein: Dann verstehe ich die Welt nicht mehr, weil das bei mir funktioniert
Wenn ja: Dann ist das mit der Liste wahrscheinlich nur ein Effekt, das Problem aber an einer anderen Stelle.

Gruss Beni


----------



## deichblach (24. Feb 2004)

hi beni,
habs ausprobiert. irgendwie funzt das.hmmmm...dann weiß ich auch nicht woran es bei mir liegt, naja dann mache ich das ganze halt anders 

trotzdem danke*g*
gruß deichi


----------



## Beni (24. Feb 2004)

Versuch mal rauszufinden, ob der Vektor überhaupt bei der Liste ankommt (z.b: kurz JList.setListData überschreiben und ein println reinhacken).

Und gib aus, ob da tatsächlich neue Elemente drin sind (manchmal sieht auch einfacher Code richtig aus, aber funktioniert dennoch nicht *hab da böse Erfahrungen*)

mfg Beni


----------



## Coleeen (27. Feb 2004)

Beni, wie meinst das einen println reinhacken? Kannst schnell zeigen, glaub eben dass meine JList den Vector gar nich bekommt. 


```
public class ClassA extends JFrame implements ActionListener{

private Vector vec = null;
private JList liste = null;

      public ClassA(){
          ........
           //da wird ein tabbedPane erstellt
          neuTab("Tab1");

           vec = new Vector();
         ........

      }

      neuTab(String title){
           ......
             liste = new JList();
            //usw was noch alles dazugehört
            JButton submit = new JButton("Submit");
            ....
      }

       public void ActionPerformed(ActionEvent e){
            if(e.getActionCommand().equals("Submit")){
                int i; 
                for(i = 4; i!=0; i--){
                    vec.addElement("Zahl "+i);
               }
               //hier wollt ich den gefüllten vector der liste übergeben
               //Wenn ich hier vorher println mach is der vector auch gefüllt
               liste.setListData(vec);      
           }
       }
}
```

hab den code da nur schnell als bsp geschrieben, kann scho noch einige fehler haben... mir geht es nur um das list.setListData(vec). da macht er keinen set sondern gibt mir ne nullpointerexception aus. jou vielleicht mach ich das ja auch falsch, aber dann weiss i echt nich an was es mehr liegen könnt.

gruss coleen die madkuh


----------



## Beni (27. Feb 2004)

Was änliches wie Du offenbar gemacht hast (kommt auf dasselbe Resultat)





> //hier wollt ich den gefüllten vector der liste übergeben
> //Wenn ich hier vorher println mach is der vector auch gefüllt
> liste.setListData(vec);



Du sagst, du hast eine _NullPointerException_, da der Vector nicht null ist (weil er sonst nicht gefüllt wäre), bleibt irgendwie nur noch _liste _???

Poste mal die Ausgabe dieser Exception.


----------



## Coleeen (27. Feb 2004)

Wieso ich eine NullPointerException hab weiss ich ja nicht *g* sons hät ich was dagegen unternommen. Den Vector habe ich ausgeprintet und er war so gefülllt wie ichs vor hatte. was nicht geht is nur das aktuallisieren mit setListData. die liste will da nich mitspielen grml..



java.lang.NullPointerException
	at ch.ag.gui.AdminPanel.searchUser(AdminPanel.java:354)
	at ch.ag.gui.Listener.actionPerformed(Listener.java:61)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1450)
	at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1504)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:378)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:250)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:216)
	at java.awt.Component.processMouseEvent(Component.java:3717)
	at java.awt.Component.processEvent(Component.java:3546)
	at java.awt.Container.processEvent(Container.java:1164)
	at java.awt.Component.dispatchEventImpl(Component.java:2595)
	at java.awt.Container.dispatchEventImpl(Container.java:1213)
	at java.awt.Component.dispatchEvent(Component.java:2499)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2451)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2216)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2125)
	at java.awt.Container.dispatchEventImpl(Container.java:1200)
	at java.awt.Window.dispatchEventImpl(Window.java:912)
	at java.awt.Component.dispatchEvent(Component.java:2499)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:319)
	at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:103)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:84)


 :roll:


----------



## Beni (27. Feb 2004)

Hm *grübel*, mal die Suche ausdehnen.

Hier gehts wohl weiter:
_ at ch.ag.gui.AdminPanel.searchUser(AdminPanel.java:354) _


----------



## Coleeen (27. Feb 2004)

auf dieser Zeile steht eben der setListData befehl
liste.setListData(vec);

ich probier nochmals einige ideen aus. schreib mal mein beispiel da, ganz in ein neues projekt.


----------

