【问题标题】:JavaFX skips instructions while connecting to serverJavaFX 在连接到服务器时跳过指令
【发布时间】:2017-10-10 19:54:04
【问题描述】:

我有两个场景的 JavaFX 应用程序。当用户填写昵称并点击按钮时,它应该改变场景然后连接到服务器。但是由于某些未知原因,它首先连接到服务器并仅在收到服务器响应时才更改场景。但它应该首先执行两个可见指令,然后才创建 Vysilac 还是我错了?

这是我的代码 - Button 方法(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);
  }
}

感谢任何帮助或建议:)

【问题讨论】:

    标签: javafx client-server


    【解决方案1】:

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

    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();
    

    【讨论】:

    • 谢谢这对我有帮助:)
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多