JList Refresh

Status
Nicht offen für weitere Antworten.

deichblach

Mitglied
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
 
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
 
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...
 
vielleicht hilft jemanden ja der Quellcode des Clienten.
Code:
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());
	}
}
 
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?
 
genau so mache ich das. deswegen weiß ich auch nicht warum das nicht funzt.
Code:
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..
Code:
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
 
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.
 
???
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
 
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.
 
ach so...
*jetzt besser versteh*

Kannst Du mir sagen ob diese List gefüllt wird?
Code:
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
 
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
 
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
 
Beni, wie meinst das einen println reinhacken? Kannst schnell zeigen, glaub eben dass meine JList den Vector gar nich bekommt.

Code:
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
 
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.
 
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:
 
Hm *grübel*, mal die Suche ausdehnen.

Hier gehts wohl weiter:
at ch.ag.gui.AdminPanel.searchUser(AdminPanel.java:354)
 
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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben