Tengo una preguntilla respecto a este tema, como podria hacer para tener una gui y que a la hora de conectar con el servidor no se me congelase la interface, pongo el código hasdta ahora:
Código
package app; import java.io.IOException; import app.view.NewServerController; import app.view.RootController; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.BorderPane; import javafx.stage.Modality; import javafx.stage.Stage; public class Main extends Application { private Stage stage; private BorderPane rootLayout; { launch(args); } @Override { this.stage = stage; this.stage.setTitle("Fenrir"); initRootLayout(); } public void initRootLayout() { try { FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("view/Root.fxml")); rootLayout = (BorderPane) loader.load(); RootController controller = loader.getController(); controller.setMain(this); Scene scene = new Scene(rootLayout); stage.setScene(scene); stage.show(); { e.printStackTrace(); } } public boolean showNewServerDialog() { try { FXMLLoader loader = new FXMLLoader(); loader.setLocation(Main.class.getResource("view/NewServer.fxml")); BorderPane page = (BorderPane) loader.load(); Stage stage = new Stage(); stage.setTitle("Conectar a servidor"); stage.initModality(Modality.WINDOW_MODAL); stage.initOwner(this.stage); Scene scene = new Scene(page); stage.setResizable(false); stage.setScene(scene); NewServerController controller = loader.getController(); controller.setDialogStage(stage); stage.showAndWait(); return controller.isOkCliked(); { e.printStackTrace(); return false; } } }
Código
package app.client; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Client { private int puerto; Socket socket; DataOutputStream mensaje; DataInputStream entrada; { this.hostname = hostname; this.puerto = puerto; } public boolean InitClient() { try { mensaje.writeUTF("Hola que tal!"); socket.close(); { e.printStackTrace(); return false; { e.printStackTrace(); return false; } return true; } }
Código
package app.view; import org.controlsfx.dialog.Dialogs; import app.client.Client; import javafx.fxml.FXML; import javafx.scene.control.TextField; import javafx.stage.Stage; public class NewServerController { @FXML @FXML @FXML @FXML @FXML private Stage stage; private boolean okClicked = false; public void setDialogStage(Stage stage) { this.stage = stage; } public boolean isOkCliked() { return okClicked; } private boolean isInputValid() { if(hostnameIpTextField.getText() == null || hostnameIpTextField.getText().length() == 0) errorMessage += "Hostname/Ip no válido!\n"; if(puertoTextField.getText() == null || puertoTextField.getText().length() == 0 errorMessage += "Puerto no válido!\n"; if(errorMessage.length() == 0) { return true; } else { Dialogs.create() .title("Campos inválidos") .masthead("Por favor, corrige los campos no válidos") .message(errorMessage) .showError(); return false; } } @FXML { if(isInputValid()) { Client client = new Client(hostnameIpTextField.getText(), Integer.parseInt(puertoTextField.getText())); boolean connected = client.InitClient(); if(connected) { okClicked = true; stage.close(); } } } @FXML private void handleCancelar() { stage.close(); } }
Código
package app.view; import javafx.fxml.FXML; import app.Main; public class RootController { private Main main; public void setMain(Main main) { this.main = main; } @FXML private void handleNewServer() { boolean okClicked = main.showNewServerDialog(); } }
Imagino que se hará la ejecución de la conexión del socket en un thread a parte, pero no me acaba de quedar claro como haría la trata de errores en el thread.
La idea que tenia era que en cuanto le de a conectar, me abra el socket en un thread separado para que la interface no se congele y en cuanto se conecte correctamente (o no) avise al thread principal para que actue en consecuencia.
Un saludo y gracias de antemano.