La soluzione al tuo problema consiste nel costruire una classe separata per il Server e lasciare la finestra come applicazione indipendente. Il server, a questo punto, sara' un Thread che gira all-interno della finestra. In questo modo la finestra non viene bloccata dal Server. A grandi linee la struttura e' simile a questa:
codice:
public class Finestra extends JFrame {
private Server server;
...
public Finestra() {\
... // inizializzazioni varie
server = new Server(this); // gli passo un puntatore alla finestra per le comunicazioni
}
// metodo chiamato dal pulsante per l'ascolto dei client
private void avviaIlServer() {
server.start();
}
public void scriviSullaTextArea(String testo) {
textArea.setText(testo);
}
}
public class Server extends Thread {
private Finestra f;
public Server(Finestra f) {
this.f = f;
}
...
private void ricevutoMessaggio(Messaggio msg) {
String testo = msg.getTexto(); // prendo il testo del messaggio o simili
f.scriviSullaTextArea(testo);
}
}
Se il server e' in un oggetto Thread separato (una classe a se stante) la finestra non si blocca, mentre il server e' in attesa di connessioni e/o messaggi. Il thread, dal canto suo, comunica con la finestra attraverso il puntatore e puo' spedire i messaggi da visualizzare in modo indipendente.
Ciao.