[Java] GUI JTextArea reagiert nicht.

KAEPS133

Freizeitschrauber(in)
Hallo, Ich bin momentan ein kleinen Chat Client und Server zu basteln. Der Client läuft wunderbar, der Server zickt mit dem GUI aber rum und ich weiß nicht warum.

In der ServerGUI habe ich eine einfache Methode die JTextArea aktuallisieren soll.

ServerGUI.java
Code:
public static void display(String msg) {
	messages.append(msg);
}

Der im Server sieht es so aus:
Server.java
Code:
  public static void start (int port){
	  try {
	      serverSocket = new ServerSocket(port);
	      ServerGUI.display("server running on port: " +port);
	    } 
	  
	  catch (IOException e) {}
	  acceptClients();
  }

  public static void acceptClients() {

    while (true) {
      try {
        clientSocket = serverSocket.accept();
        int i = 0;
        for (i = 0; i < maxClientsCount; i++) {
          if (threads[i] == null) {
            (threads[i] = new clientThread(clientSocket, threads)).start();
            break;
          }
        }
        if (i == maxClientsCount) {
          PrintStream os = new PrintStream(clientSocket.getOutputStream());
          os.println("Server too busy. Try later.");
          os.close();
          clientSocket.close();
        }
      } catch (IOException e) {
        System.out.println(e);
      }
    }
  }

Kommentiere ich in der start Methode acceptClients(); aus, heißt die Methode wird nicht aufgerufen wird die GUI wunderbar aktualisiert und der text "server running on port: " +port ist dort zu lesen, wird acceptClients(); allerdings aufgerufen ist Funkstille. Ich habe zu Testzwecken die display() Methode umgestellt auf ein System.out.println(msg) umgestellt und das kommt an.

Irgendwas muss also mit der GUI spinnen. Ich dachte zuerst das es daran liegt das die GUI nicht mit einem eigenen Thread gestartet wurde, aber auch mit invokeLater gibt es keine Abhilfe.
Hat jemand eine Idee warum sich die GUI verweigert?

Vielen Dank!
 
Kannst du in der GUI noch irgendetwas machen, während die while Schleife läuft (bzw. erscheint bei Windows "keine Rückmeldung")? Falls nein (bzw. ja), lockst du mit der Schleife die GUI aus (-> Schleife in separaten Thread auslagern als eine mögliche Lösung). Das wäre jetzt zumindest meine erste Vermutung...
 
Zuletzt bearbeitet:
Ich kenn mich mit Java nicht so gut aus, aber ich denke, das das Programm nur die Oberfläche aktualisiert wenn die Funktion abgeschlossen ist. In Delphi gibt es für den Fall, das man während einer Schleife auf Programmeingaben reagieren möchte den Befehl application.ProcessMessages. Dieser wird in den Schleifenrump eingefügt und das Programm kann z.B. während einer Schleife überprüfen, ob der Stop-Button gedrückt wurde. Vielleicht gibt es in Java etwas ähnliches.
 
Ich habs gelöst bekommen. Neben dem Thread für die GUI habe ich einfach die ganze Server Klasse noch in einem extra Thread gestartet und dann klappt es.
Dachte zwar wenn ich die GUI mit einem extra Thread vom Server trenne reicht es aus, war aber dann wohl doch nicht so.

Danke für die Hilfe!
 
Zurück