Client-Fenster bei Aufruf unvollständig

Tecwan

Aktives Mitglied
Ich habe eine Klasse Client geschrieben, die nach Eingabe einer Anweisung in ein Textfeld
diese Eingabe an einen Server übermittelt und dessen Antwort in einem JLabel ausgibt.
Starte ich
Code:
Client.main()
direkt, läuft alles wie gewünscht.
Nun möchte ich den Clienten in seinem eigenem Frame nicht isoliert betreiben, sondern
als Teil diverser Projekte aufrufen können.
Ich habe in einem dieser Projekte einen Button, der
Code:
Client.main()
aufrufen soll:

Java:
private void startLblMouseClicked(java.awt.event.MouseEvent evt) {
    Client.main(null);
    this.dispose();
}
Das Fenster des Aufrufers soll geschlossen werden, und stattdessen das Client-Fenster
erscheinen. Was passiert, ist aber Folgendes:
Der Client wird gestartet, Kontakt zum Server aufgebaut und die Begrüßungsnachricht
erhalten. ABER: das Frame bleibt leer, das alte Frame wird nicht geschlossen, und
"mausische" Interaktionen (mit beiden Frames) werden unmöglich.

Hier der Quelltext von Client:

Java:
public class Client extends JFrame implements ActionListener {
    
    private BufferedReader bReader;
    private PrintStream pStream;
    
    private JTextField input = new JTextField(40);    
    private JLabel outLbl = new JLabel();		//html-fähig

    
    public Client(Socket socket,String title) {
        setTitle(title);
        addWindowListener(
            new WindowAdapter() {
                public void windowClosing(WindowEvent winEvt) {
                    System.out.println("CloseBox clicked");
                    pStream.println("disconnect");
                    System.exit(0); 
                }
        });   
        
        outLbl.setVerticalAlignment(javax.swing.JLabel.BOTTOM);
        outLbl.setText("<html>");
        outLbl.setPreferredSize(new Dimension(200,220));	//nur für y
        
        input.addActionListener(this);
        Container content = getContentPane();
        content.add(new JScrollPane(chat), BorderLayout.CENTER);      
        content.add(input, BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        input.requestFocusInWindow();
        setVisible(true);
        try {
            bReader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
            pStream = new PrintStream(socket.getOutputStream(),true);
        } catch (Exception e) {System.out.println(e);}
    }

    public void actionPerformed(ActionEvent e) {
        pStream.println(input.getText());
        input.setText("");
        input.requestFocusInWindow();
    }

    public void listen() {
        String s;
        try{
            while ((s = bReader.readLine()) != null) {
                outLbl.setText(outLbl.getText()+"<br>"+s);    
            }
            pStream.close();
            bReader.close();
        } catch (Exception e) { e.printStackTrace(); }
        System.exit(0);
    }

    public static void main(String[] args)  {
        try{
            Client c = new Client( new java.net.Socket(host,port), title );
            c.listen();
        } catch (Exception e) { e.printStackTrace(); }
}


Es ist klar, dass Client in der
Code:
listen()
-Schleife hängt (Meldungen vom Server erreichen
das Innere, wie
Code:
System.out.println(s);
zeigt. Aber das Programm lässt nicht los, so
dass der Inhalt des Frames (outLabel mit der Anzeige und das Textfeld input) gar nicht erst
angezeigt wird und folglich der Programmlauf auch nicht zum ersten Frame mit dem
Code:
dispose()
zurückkehren kann.

Was muss ich da ändern?
 
boa leute ... echt ...

GooGLe und SuFu ...

genau das thema hatten wir erst gestern im net-forum ...

für die lösung also bitte mal dort nachlesen ...

tipp : THREADS
 
Du legst den EDT in ne Endlosschleife. Deswegen kann dieser nicht weiter die GUI aufbauen oder auf Useraktionen reagieren.

Die endlosschleife erzeugst du in:
Client.main(null); -> c.listen();

Es ist übrigens fragwürdig die main Methode aufzurufen. Erstellt dir lieber eine Client instanz und rufe darauf listen auf. Die Methode sollte dann ihre Aktion in nem separaten Thread ausführen.
 
@EikeB
ok, also EDT ist - nehme ich mal an - der Ausdruck für das, was man als den Fokus des Programmablaufs bezeichen würde.

Dass es in der Endlosschleife hängt, ist mir klar.

Nicht klar ist mir allerdings, warum ein direkter Aufruf, der eigentlich zur gleichen Endlosschleife führen müsste, dies nicht tut - das Fenster wird komplett aufgebaut.

Wenn ich in
Java:
private void startLblMouseClicked(java.awt.event.MouseEvent evt) {       
        //Client.main(null);

        Client c=null;
        try{
            c = new Client( new java.net.Socket(host, port),title);
        } catch (Exception e) {}
        c.listen();     
        
        this.dispose();
    }

erst den Clienten erzeuge und anschließend listen() aufrufe, funktioniert es auch nicht. Oder habe ich da was missverstanden?
 
EDT = EventDispatchThread ... ist für die UI zuständig ... -> einfach mal mit der maus über EDT fahren ... und dann den tooltip googlen *was du ja scheinbar nicht kannst*

http://www.java-forum.org/netzwerkp...ogramm-mehrere-clients-server.html#post879435
http://www.java-forum.org/netzwerkprogrammierung/133579-socket-thread-falsch.html
http://www.java-forum.org/netzwerkprogrammierung/133333-tcp-server-client.html
http://www.java-forum.org/netzwerkp...oxyserver-performance-problem.html#post875763
Galileo Computing :: Java ist auch eine Insel – 14 Threads und nebenläufige Programmierung
Thread (Informatik) ? Wikipedia
Java Threads Tutorial

so ... da hast du jetzt eine GANZE MENGE quellen ... die ersten 4 sogar hier aus diesem forum ...
wenn du es jetzt immer noch nicht packst ... dann hast du n gewaltiges verständnisproblem ...

wir sind hier da um bei konkreten problemen zu helfen ... nicht um uns eine millionen mal zu wiederholen und/oder das zu sagen was google liefert ...
 
boa leute ... echt ...

GooGLe und SuFu ...

wenn du es jetzt immer noch nicht packst ... dann hast du n gewaltiges verständnisproblem ...

wir sind hier da um bei konkreten problemen zu helfen ... nicht um uns eine millionen mal zu wiederholen und/oder das zu sagen was google liefert ...

Warum so harte Worte? Das hier ist der Bereich "Anfänger-Themen" des Java-Forums. Gerade zu Beginn versteht man noch nicht alles gleich beim ersten Lesen. Ausserdem wurde doch ein konkretes Problem mit Beispielcode gepostet.
 
@irgendjemand
Nein, dass es hier eine ToolTip-Funktion gibt, habe ich nicht gewusst.
Die Info ist hilfreich.
*was du ja scheinbar nicht kannst*
Das ist nicht hilfreich.
Das ist beleidigend, und die Relativierung "scheinbar" macht es nicht besser, denn sie unterstellt
mir bösen Willen, Faulheit oder Unfähigkeit.
Wenn du mich schon als irgendwie behindert erkennst, dann könntest du mich auch so behandeln.
Sprich mit Geduld und nicht mit solchen Äußerungen.
Oder hast du hier im Forum die Funktion des bösen Hausmeisters übernommen, der unfähiges
Gesindel vor der Eingangstür zwecks Qualitätssteigerung vertreiben soll?

Nein, ich will dich nicht anmachen, und ich honoriere deine Hilfe. Aber wenn es dich ärgert, stets
mit den gleichen nervigen Problemen konfrontiert zu werden, dann lass es sein.
Denn du machst das freiwillig und ich nehme nicht an, dass dich Masochismus dazu zwingt.
Mit Beleidigungen gewürzte Hilfe mag zwar vielen aus der Seele sprechen, ist aber eine
persönliche Sackgasse.

Ich darf dir verraten, dass ich in der Tat mindestens drei der genannten Quellen bereits vorher
gesehen habe, und dass ich es daraufhin trotzdem nicht hinbekommen habe.
Mein zugehöriger Server läuft mutithreaded, und den Code verstehe ich sogar.
*Tust du nicht* höre ich da in meinem geistigen Ohr.
Dass da was Wahres dran ist, macht es nicht besser, aber ich tue was ich kann.
Meine Methode lautet learning by doing, und wenn ich etwas nicht allein bzw. mit Google schaffe,
dann frage ich. Und erst dann.
Oft erkenne ich das Problem schon selbst, aber manchmal fehlen einfach nur ein paar Zeilen
konkreter Code. Das ist mir schon peinlich genug.

So, und inzwischen habe ich jetzt auch die Lösung (weshalb dieser Post auch erst
jetzt nach dem meines Vorposters erfolgt):

Java:
private void startLblMouseClicked(java.awt.event.MouseEvent evt) {
        ( new Thread() {
            public void run() {               
                try{            
                    Client c = new Client( new java.net.Socket(host, port),title);
                    c.listen();
                } catch (Exception e) { e.printStackTrace(); }               
            }
        }).start();        
        this.dispose();
    }
 
Zuletzt bearbeitet:
Ich habe überlegt, ob der Thread unbedingt beim Aufrufer liegen muss, und die Antwort ist: nein, im Gegenteil.
Der Thread gehört in die Klasse, die diesen benötigt, und dort in die entsprechende Methode.

Also nicht den Thread in der aufrufenden Klasse erzeugen lassen (wie die Lösung oben vorsah),
sondern in die verursachende Methode.

Es ist übrigens fragwürdig die main Methode aufzurufen. Erstellt dir lieber eine Client instanz und rufe darauf listen auf. Die Methode sollte dann ihre Aktion in nem separaten Thread ausführen.
Danke @EikeB, jetzt hab ichs endlich verstanden.

Java:
public void listen() {
    ( new Thread() { public void run() {    
        try{
            String s;
            while ((s = bReader.readLine()) != null) {
                outLbl.setText(outLbl.getText()+"<br>"+s);    
            }
            pStream.close();
            bReader.close();
        } catch (Exception e) { e.printStackTrace(); }
    } }).start();
    System.exit(0);
}
 
Warum so harte Worte? Das hier ist der Bereich "Anfänger-Themen" des Java-Forums. Gerade zu Beginn versteht man noch nicht alles gleich beim ersten Lesen. Ausserdem wurde doch ein konkretes Problem mit Beispielcode gepostet.

weil es langsam einfach nur noch langweilig und vor allem lächerlich wird wenn man innerhalb von 2 wochen 10 threads hat welche sich mal wieder um ein und das selbe problem drehen ...

und das die meisten entweder einfach nur zu faul ... oder sogar zu unfähig dazu sind GooGLe und/oder die SuFu zu verwenden sieht man alleine schon an den knallern welche immer wieder mit JavaScript hier an kommen ...

langsam frag ich mich echt : warum gibt es überhaupt diese großen nachschalge-werke und eine millionen an sample-codes sowie das Sun Tutorial ... wenn das scheinbar niemand liest sondern sich 99% denken : ich schreib gleich mal ins erst-beste forum "funktioniert nicht" ...

wie ich ja bereits öfter sagte : wer es nicht auf die reihe bekommt einen rechner halbwegs vernünftig zu verwenden und noch weniger plan davon hat was da im inneren wirklich abläuft ... der hat meiner ansicht nach nicht wirklich das recht einem rechner dann auch noch vorschreiben zu wollen was dieser zu tun hat *um programmieren mal ziemlich allgemein zu halten* ...

weil ich mein ... worauf läuft es denn hinaus wenn jemanden sofort und ohne widerworte beim ersten mal geholfen wird : darauf das dieser jemand immer wieder nachfragt und ihm immer wieder geholfen wird ... OHNE das auch nur einmal auf die idee kommt diesen user mal darauf hinzuweisen das all seine probleme genau in der art und weise bereits gelöst wurden ... oder meist als lösung den aufgaben beiliegen *was bei jedem guten anfänger buch der fall ist welches aufgaben enthält *was bei der Java-Insel nun eher nicht so der fall ist** ...

und irgendwo ist dieser grad des lächerlichen und des self-pwnge erreicht wo es einfach nicht mehr lustig ist und es auch keinen spaß mehr macht anfängern zu helfen in diese branche einzutauchen ...

am wirklich lächerlichsten find ich immer die die meinen : "aber bitte auf deutsch" ...
serious ? ich mein ... nennt mir doch mal auch nur eine programmiersprache deren tools DEUTSCHE fehlermeldungen ausgeben ... oder eine "deutsche" syntax bzw keywords haben ...
und selbst hier fängt es doch schon an : "syntax" , "keywords" , "tools" , "API" , "IDE" ... alles englische begriffe ... und auch wenn man das von mir genannte alles übersetzen kann ... eine programmiersprache welche im englisch sprachigen raum ihre wurzeln hat wird das wenig intressieren ...
 
wie ich ja bereits öfter sagte : wer es nicht auf die reihe bekommt einen rechner halbwegs vernünftig zu verwenden und noch weniger plan davon hat was da im inneren wirklich abläuft ... der hat meiner ansicht nach nicht wirklich das recht einem rechner dann auch noch vorschreiben zu wollen was dieser zu tun hat *um programmieren mal ziemlich allgemein zu halten* ...
Das meinst du nicht wirklich ernst?! Zuerst dachte ich ja, du hättest dich nur ein bisschen im Ton vergriffen, aber das was du jetzt schreibst, ist echt der Oberhammer!

Jeder hat mal angefangen, sich mit Computern zu beschäftigen oder programmieren zu lernen, auch du. Wer bist du, dass du anderen vorschreiben willst, ob sie das Recht dazu haben oder nicht!? Tssss...
 
[OT]Unterstützend möchte ich noch hinzufügen, dass irgendjemand meistens recht mit seinen Beiträgen hat. Klar macht der Ton die Musik, aber, wie schon einmal erwähnt, gehört ein bisschen OT meistens immer dazu. Der Rest des Themas ist mir zum Durchlesen zu lang, deshalb auch nur ein OT Beitrag...[/OT]
 
und irgendwo ist dieser grad des lächerlichen und des self-pwnge erreicht wo es einfach nicht mehr lustig ist und es auch keinen spaß mehr macht anfängern zu helfen in diese branche einzutauchen ...

und dann lässt man ein wenig Dampf ab, ja?
So'n Bischen noob bashing. Das macht dann mehr Spaß?
Das bezweifle ich.
*cynism off, fairness on*

Geh mal davon aus, dass wer Hilfe sucht, Hilfe braucht.
Und wer sie sich von den großartigen Nachschlagewerken holen kann, der kreuzt auch nicht
mit lächerlichen Fragen in einem Forum auf. Ist doch tröstlich: Für jeden lächerlichen Beitrag,
der auftaucht, gibts die ungeschriebenen, die niemand sieht.

Natürlich ist es legitim und auch angebracht, darauf hinzuweisen, dass und wo ein ähnliches
Problem schon häufig behandelt worden ist.
Und dass es gehörig auf die Nerven gehen kann, ist verständlich.

Aber Beleidigungen?
Da ist für mich der Punkt erreicht, an dem ich den Gedanken nahelege, zu pausieren und etwas
Abstand zu gewinnen. Denn ändern lässt es sich nicht. Die Dummen sterben nicht aus, und für
jeden "Belehrten" wachsen zwei weitere Dumme nach. Wenn man nur auf die schaut, geht man
kaputt. Und wenn man sie beleidigt, nimmt man sich auch die Chance, dass daraus mal Mitstreiter
im Kampf gegen die Dummheit werden.

Wenn du dich also über mangelnden Spaß beschwerst, dann liegt das durchaus auch bei dir.
 

Neue Themen


Zurück
Oben