2017-10-10 63 views
0

我有兩個場景的JavaFX應用程序。當用戶填充暱稱並點擊按鈕時,它應該改變場景然後連接到服務器。但由於某種未知的原因,它首先連接到服務器,並且只有在服務器得到響應時才更改場景。但它應該首先做兩套可見指示,然後才能創建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應用程序線程。在這種情況下,我會用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(); 
+0

感謝這幫了我:) –