JavaFX 在连接到服务器时跳过指令
JavaFX skips instructions while connecting to server
我有两个场景的 JavaFX 应用程序。当用户填写昵称并点击按钮时,它应该改变场景然后连接到服务器。但是由于某些未知原因,它首先连接到服务器并仅在从服务器获得响应时才更改场景。但它应该首先执行两组可见指令,然后才创建 Vysilac 还是我错了?
这是我的代码 - 按钮方法(spusteni 和 cekani 是场景的名称),Vysilac 是 class 处理连接。
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);
}
}
感谢任何帮助或建议:)
您需要在单独的线程上 运行 长时间 运行ning 操作。否则,您将阻塞负责更新 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();
我有两个场景的 JavaFX 应用程序。当用户填写昵称并点击按钮时,它应该改变场景然后连接到服务器。但是由于某些未知原因,它首先连接到服务器并仅在从服务器获得响应时才更改场景。但它应该首先执行两组可见指令,然后才创建 Vysilac 还是我错了?
这是我的代码 - 按钮方法(spusteni 和 cekani 是场景的名称),Vysilac 是 class 处理连接。
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);
}
}
感谢任何帮助或建议:)
您需要在单独的线程上 运行 长时间 运行ning 操作。否则,您将阻塞负责更新 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();