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
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
aufrufen soll:
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:
Es ist klar, dass Client in der
-Schleife hängt (Meldungen vom Server erreichen
das Innere, wie
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
zurückkehren kann.
Was muss ich da ändern?
diese Eingabe an einen Server übermittelt und dessen Antwort in einem JLabel ausgibt.
Starte ich
Code:
Client.main()
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()
Java:
private void startLblMouseClicked(java.awt.event.MouseEvent evt) {
Client.main(null);
this.dispose();
}
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()
das Innere, wie
Code:
System.out.println(s);
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()
Was muss ich da ändern?