Java PrintStream auf jTextArea aktualisieren

PEASANT KING

Commander
Registriert
Okt. 2008
Beiträge
2.412
Hallo Leute,

irgendwie stehe ich auf dem Schlauch.
Ich habe eine Server Application die bei Anfragen Informationen zurück gibt.
Diese kann ich auch mittels Clientanwendung empfangen.

Nun habe ich eine GUI gebaut und möchte die Informationen auf eine jTextArea appenden soweit so gut. Leider weiß ich nur nicht so ganz wie ich das bewerkstelligen soll.

Die Client Anwendung hat 3 Klassen die GUI Mainklasse, eine Connector Klasse zum Server und eine Connector Thread Klasse.

Die Mainklasse beinhaltet die GUI und deren Event Funktionen beim Klick auf Buttons, die Connector Klasse stellt eine Verbindung zur Server App her und liest und schreibt auf den jeweiligen Socket. Die Klasse für den Thread ist dazu da die Antworten vom Server zu lesen.

Von der GUI Befehle abzusetzen die am Server ankommen funktioniert, Antworten vom Server erhalte ich auch weiß aber nicht genau wie ich sie auf die jTextArea bekomme und immer zu denm Zeitpunkt wenn eine neue Antwort erhalten wird...
 
Die GUI Klasse braucht eine public Methode um den Text in die JTextArea zu setzten bzw. anzufügen. Deine Thread-Klasse braucht dann eine Referenz auf die GUI-Klasse um diese Methode aufzurufen.
 
Ohne deinen Code nun ganz zu kennen.

Den Stream vom Socket holen, mit readLine() die Nachricht rauslesen und in einem String speichern. Dann das ganze in die JTextArea schreiben...

Das ganze evtl. in einer while(true)-Schleife? So ganz ohne deinen Server und Client kann ich da nicht viel anderes sagen.
 
Ja natürlich, ich Depp habe es die ganze Zeit in die andere Richtung versucht, also Methode in der Threadklasse und in der GUI Klasse eingebunden.

Methode in der GUI
Code:
public void consoleOutput(String msg) {
       consoleOutput.append(msg);
}

Leider erhalt ich nun ne Nullpointer Exception im Connector
Code:
public void run() {
        try {
            socket = new Socket(srvAdress, port);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintStream(socket.getOutputStream());
      
            Thread t = new SocketThread(out);
            t.setDaemon(true);
            t.start();

            while (true) {
                msg = in.readLine();
                bc.consoleOutput(msg);
            
                if (msg == null) {
                break;
                }
                System.err.println(msg);
            }
        }catch (UnknownHostException ex) {
            Logger.getLogger(xxx.class.getName()).log(Level.SEVERE, null, ex);
            System.exit(0);
        }catch(IOException ex) {
            Logger.getLogger(xxx.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 
*Wo* erhältst du die NullpointerException? Ist bc vielleicht null?
 
Wo kommt nun genau die NullPointerException?


Und deine while(true) ist so etwas kürzer ;)
Code:
while ( (msg = in.readLine()) != null) {
   bc.consoleOutput(msg);
   System.err.println(msg);
}
 
Ich bekomme die Nullpointer Exception in bc.consoleOutput(msg); ist auch logisch da die msg manchmal nun mal null ist, wenn der Server nichts zurück gibt.
 
dann nimm meine Variante und das Problem mit der NullPointer sollte Geschichte sein
 
Leider nicht, Problem besteht weiterhin. Ich seh vor lauter Bäumen nix mehr :D
 
Immer noch in der während des Mehtodenaufrufes?
Code:
bc.consoleOutput(msg);

Da der String msg jetzt eigentlich nicht null sein dürfte, muss es am Object bc liegen. Wie wird das erstellt und wie lautet die komplette Fehlermeldung (also auf welcher Ebene liegt die Exception)?
 
Die Meldung lautet: Exception in thread "Thread-1" java.lang.NullpointerException at gfm.ll.bcom.Connector.run(Connector.java:48)

Also nicht sehr aussagekräftig.
Ich glaube das Problem ist das die GUI eine main Methode beinhaltet und eine run(); denn als ich bc mit BComm bc = new BComm(); instanziert habe ich AWT StackOverflowError bekommen, also muss ich mal eben die GUI Klasse umschreiben.

EDIT:

Ich habe es hinbekommen das die NullPointerException weg ist, allerdings wird nichts der jTextArea angefügt, wenn ich einen Befehl absetze und eine Antwort erhalte.
 
Zuletzt bearbeitet:
Extra Klasse schreiben, die nur eine main-Methode enthält. Diese ruft erstellt die GUI bzw. startet sie über start(). Es sollte pro Programmstart ja nur eine HauptGUI geben, oder?
Im Konstruktur der GUI, dann alles initialisieren und über run... nur mal so, warum hat die GUI ne run()-Methode?

Programmierst du nach dem MVC-Konzept?

edit: gut Möglich, dass dein neu erstelltes bc nicht das laufende ist. Du musst deiner Connector-Klasse ja deine GUI übergeben, damit er darauf Methoden aufrufen kann...

Code:
// neue Methode die alles initialisiert

// Erstellen der GUI
BComm bc = new BComm();

/* Erstellen der Connector-Klasse und der Connector-Klasse die GUI mitteilen, damit der Connector auf der laufenden GUI Methode aufrufen kann*/
con = new Connector(bc);
 
Zuletzt bearbeitet:
Die Gui hat ne Run Methode, weil ich für diesen kleinen Test keine Gui selber schreiben wollte, sondern mir die eben im GUI Builder von Netbeans zusammen gebaut habe.

Wenn man weiß was man macht funktioniert es wunderbar.

Bis auf das kein Text auf der jTextArea ankommt läuft alles.
Ich glaub ich gib es einfach auf, mal eben ne Client GUI App für den eigenen Bukkit Serer zu schreiben, nimmt mehr Zeit in Anspruch als gedacht.

EDIT:

Versteh nicht so ganz was du mir damit sagen willst.
Die Klasse Connector hat den Konstruktor Connector(String srvAddress, int port) und wird in der GUI Methode aufgerufen.
 
Zuletzt bearbeitet:
Na woher kennt die Klasse Connector denn das Object bc?
Die Klasse Connector will ja auf dem Object bc eine Methode aufrufen. Daher brauch es ja eine Referenz zu dem GUI-Obejct bc. In der Klasse Connector kannst du ja nicht einfach ein neues BComm-Object erstellen. Das wäre denn ja ein anderes als das laufende.

Hoffe, dass ist verständlich :S
 
Das ist korrekt, allerdings ist Connector nur eine Klasse die eine Verbindung über Sockets erstellt und auf dem jeweiligen Socket lauscht oder schreibt.

Instanziert wird Connector in der GUI Klasse, da die Klasse auch gleichzeitig meine Main darstellt.

Vielleicht fehlt mir einfach noch etwas an Wissen.
 
Aber genau hier
Code:
bc.consoleOutput(msg);
kommuniziert die Connector-Klasse ja mit der GUI. Und deswegen sollte die Connector-Klasse die GUI kennen.

Genauer gefragt: Wo kommt das Object "bc" in der Connector-Klasse her?
 
In der Sache hast du schon recht. Ich Depp habe natürlich einfach nur BComm bc = new BComm(); angeben, aber das ist ja Schwachsinn, weil er dann ja ein neues GUI Objekt erstellt und nicht das laufende aktuelle nutzt.

Ich habs nun gerafft und hinbekommen. Danke für die Geduld...
 
Zuletzt bearbeitet:
einfach dem Connector noch das BComm-Objekt übergeben und dann sollte er es auch hinzufügen ;)

Kein Problem, Fehlersuche macht doch immer wieder Spaß^^
 
Haha geht ne ;)

Ich habe ne neue Main Class geschrieben und der Gui Klasse alles rausgenommen was nicht mit GUI zu tun hat.
In der Connector Klasse die laufende GUI im Konstruktor übergeben und schon wird alles auf der TextArea angezeigt.
 
Zurück
Oben