Zabrałem się za napisanie aplikacji czatu, do tworzenia GUI korzystam z JavaFX. Całość składa się z 2 projektów, Serwer oraz Klient. Niestety napotkałem drobne problemy, związane z aplikacją Klienta. Zacznę od widoku, czyli metody podpiętej pod przycisk

private void connectToSelected(){
if(serverTable.getSelectionModel().getSelectedItem() != null) {
ServerConnectionController serverConnectionController = new ServerConnectionController();
serverConnectionController.createConnection(serverTable.getSelectionModel().getSelectedItem().getAddress(),
serverTable.getSelectionModel().getSelectedItem().getPort());
}
}

Wywołuje ona Controller, który z kolei tworzy Połączenie

public class ServerConnectionController {
final static Logger LOGGER = Logger.getLogger(ServerConnectionController.class);

private ServerConnection connection;
private ConversationWindow conversationWindow;

public void createConnection(String host, String port) {
    connection = new ServerConnection(host, Integer.parseInt(port), this);
    connection.start();
}

public void openConversationWindow(){
    conversationWindow = new ConversationWindow(connection.getHost(), String.valueOf(connection.getPort()));
}

}

Które znów łączy się z wskazanym hostem i w przypadku powodzenia, chce by otworzyło się nowe okno.

public class ServerConnection extends Thread {
final static Logger LOGGER = Logger.getLogger(ServerConnection.class);

private String host;
private int port;

private Socket socket;
private ObjectOutputStream output;
private ObjectInputStream input;

private ServerConnectionController controller;

public ServerConnection(String host, int port, ServerConnectionController controller) {
    this.host = host;
    this.port = port;
    this.controller = controller;
}

@Override
public void run() {
    try {
        Status.setStatus("Connecting...");

        this.socket = new Socket(host, port);
        this.input = new ObjectInputStream(socket.getInputStream());
        this.output = new ObjectOutputStream(socket.getOutputStream());
        this.output.flush();

        Status.setStatus("Connected");
        controller.openConversationWindow();

    } catch (IOException e) {
        LOGGER.error(e.toString());
        Status.setStatus("Unable to communicate with server");
    }
}    

}

Status to po prostu SimpleStringProperty, podpięty pod Label po stronie widoku. No ale do sedna, jeżeli spróbuje połączyć się z wyłączonym/nie istniejącym serwerem, po chwili status zmieni się z "Connecting..." na "Unable to communicate with server". Jeżeli jednak serwer działa, aplikacja klienta pozostanie przy "Connecting...", nie otworzy się nowe okno, mimo że po stronie serwera widzę po logach, że rejestrowane jest nowe połączenie.