JavaFX在连接到服务器时跳过指令

JavaFX在连接到服务器时跳过指令,javafx,client-server,Javafx,Client Server,我有两个场景的JavaFX应用程序。当用户填充nick并单击按钮时,它应该更改场景,然后连接到服务器。但由于一些未知的原因,它首先连接到服务器,只有在收到服务器的响应时才更改场景。但它应该首先执行两组可见指令,然后才创建Vysilac,否则我错了吗 这里是我的代码按钮方法spusteni和cekani是场景的名称,Vysilac是处理连接的类 Vysilac vysilac; @FXML private void pripojSe() throws IOException { Strin

我有两个场景的JavaFX应用程序。当用户填充nick并单击按钮时,它应该更改场景,然后连接到服务器。但由于一些未知的原因,它首先连接到服务器,只有在收到服务器的响应时才更改场景。但它应该首先执行两组可见指令,然后才创建Vysilac,否则我错了吗

这里是我的代码按钮方法spusteni和cekani是场景的名称,Vysilac是处理连接的类

Vysilac vysilac;

@FXML
private void pripojSe() throws IOException
{
   String nick = textNick.getText();
   if (nick != null && !nick.equals("")) 
   {
    spusteni.setVisible(false);
    cekani.setVisible(true);
    vysilac = new Vysilac(nick);
   }
}


public class Vysilac 
{
private String nick = "Chyba - nick neexistuje";
private Socket socket;
private ObjectOutputStream output;
private ObjectInputStream input;

  Vysilac( String nick) throws IOException
  {
      this.nick = nick;
      socket = new Socket("localhost",33);
      output = new ObjectOutputStream(socket.getOutputStream());
      input = new ObjectInputStream(socket.getInputStream());
      //System.out.println(nick);
      output.writeObject(nick);
  }
}

感谢您的帮助或建议:

您需要在单独的线程上运行长时间运行的操作。否则,将阻止负责更新UI的JavaFX应用程序线程。在这种情况下,我会使用任务来完成工作:

spusteni.setVisible(false);
cekani.setVisible(true);
Task<Vysilac> task = new Task<Vysilac>() {
    @Override
    protected Vysilac call() throws IOException {
        return new Vysilac(nick);
    }
};

// register state handlers
task.setOnSucceeded(evt -> vysilac = task.getValue());
task.setOnFailed(evt -> {
    // TODO: error handling
});

new Thread(task).start();

感谢这对我的帮助: