2017-10-10 8 views
0

2つのシーンのJavaFXアプリケーションがあります。ユーザーがニックネームを塗りつぶしてボタンをクリックすると、シーンを変更してサーバーに接続する必要があります。しかし、いくつかの未知の理由から、まずサーバーに接続し、サーバーから応答を受け取ったときにのみシーンを変更します。しかし、それは最初に2つのセットのVisible命令を実行してから、Vysilacを作成するか、間違っていますか?JavaFXはサーバーに接続中の手順をスキップします

ここではコードボタンメソッド(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); 
    } 
} 

感謝:)

答えて

1

あなたは別々のスレッドで長時間実行操作を実行する必要があります。それ以外の場合は、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(); 
+0

ありがとうございました。 –

関連する問題