J'essaie de changer de scène dans JavaFX. J'ai déjà créé 3 scènes - écran de connexion, profil et registre. Pour une raison quelconque, je ne peux pas passer de l'écran de connexion au profil. Le bouton "Enregistrer" dans l'écran de connexion fonctionne, ainsi que le bouton "Retour" dans l'écran de registre. Lorsque vous cliquez sur le bouton "Connexion", rien ne se passe. Qu'est-ce que je rate? Voici la classe principale:JavaFX changeant scène ne fonctionne pas
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import jedzenie.windows.LogInScreen;
import jedzenie.windows.ProfileInfoScreen;
import jedzenie.windows.RegisterScreen;
public class App extends Application
{
Stage stage;
Scene scene, scLogIn;
LogInScreen logInScreen;
RegisterScreen regis;
ProfileInfoScreen profileScreen;
@Override
public void start(Stage primaryStage){
primaryStage.setTitle("FoodCalc");
stage = primaryStage;
logInScreen = new LogInScreen(this);
scLogIn = new Scene(logInScreen, 400, 400);
scLogIn.getStylesheets().add(getClass().getResource("logInScreen.css").toExternalForm());
primaryStage.setScene(scLogIn);
primaryStage.show();
}
public void moveToRegisterScreen(){
regis = new RegisterScreen(this);
Scene scRegister = new Scene(regis, 575, 250);
scRegister.getStylesheets().add(getClass().getResource("registerScreen.css").toExternalForm());
stage.setScene(scRegister);
}
public void logOut(){
stage.setScene(scLogIn);
}
public void logIn(){
profileScreen = new ProfileInfoScreen(this);
Scene scProfile = new Scene(profileScreen, 500, 400);
scProfile.getStylesheets().add(getClass().getResource("registerScreen.css").toExternalForm());
stage.setScene(scProfile);
}
public static void main(String[] args)
{
launch(args);
}
}
La classe LogInScreen:
import javafx.event.ActionEvent;
import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import jedzenie.app.App;
public class LogInScreen extends GridPane {
App main;
public LogInScreen(App main){
this.main = main;
setAlignment(Pos.CENTER);
//setGridLinesVisible(true);
setVgap(15);
setHgap(10);
Label welc = new Label("Welcome to FoodCalc. Please log in or register.");
add(welc, 0, 0, 2, 1);
Label lbUser = new Label("Username: ");
add(lbUser, 0, 1);
TextField tfUser = new TextField();
add(tfUser, 1, 1);
Label lbPass = new Label("Password: ");
add(lbPass, 0, 2);
PasswordField pfPass = new PasswordField();
add(pfPass, 1, 2);
Button logIn = new Button("Log in");
add(logIn, 1, 3);
setHalignment(logIn, HPos.RIGHT);
logIn.setOnAction((ActionEvent e) -> {
main.logIn();
});
Button register = new Button("Register");
add(register, 1, 4);
setHalignment(register, HPos.CENTER);
register.setOnAction((ActionEvent e) -> {
main.moveToRegisterScreen();
});
}
}
Et la classe RegisterScreen:
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import jedzenie.app.App;
public class RegisterScreen extends BorderPane {
App main;
Button register;
ComboBox age;
PasswordField pfPass, pfConfPass;
public RegisterScreen(App main){
this.main = main;
setCenter(gridPane());
setBottom(hbox());
setPadding(new Insets(25,25,25,25));
}
GridPane gridPane() {
GridPane gp = new GridPane();
gp.setGridLinesVisible(true);
gp.setVgap(15);
gp.setHgap(10);
gp.setAlignment(Pos.CENTER);
Label lbUser = new Label("Username: ");
gp.add(lbUser, 0, 1);
TextField tfUser = new TextField();
gp.add(tfUser, 1, 1);
Label lbPass = new Label("Password: ");
gp.add(lbPass, 0, 2);
pfPass = new PasswordField();
gp.add(pfPass, 1, 2);
Label lbConfPass = new Label("Confirm Password: ");
gp.add(lbConfPass, 0, 3);
pfConfPass = new PasswordField();
gp.add(pfConfPass, 1, 3);
Label lbEmail = new Label("Email: ");
gp.add(lbEmail, 0, 4);
TextField tfEmail = new TextField();
gp.add(tfEmail, 1, 4);
Label lbSex = new Label("Sex: ");
gp.add(lbSex, 2, 1);
ComboBox cbSex = new ComboBox();
gp.add(cbSex, 3, 1);
Label lbAge = new Label("Age: ");
gp.add(lbAge, 2, 2);
ComboBox cbAge = new ComboBox();
gp.add(cbAge, 3, 2);
Label lbWeight = new Label("Weight: ");
gp.add(lbWeight, 2, 3);
TextField tfWeight = new TextField();
gp.add(tfWeight, 3, 3);
return gp;
}
HBox hbox(){
HBox hbox = new HBox(10);
Button back = new Button("Back");
hbox.getChildren().add(back);
back.setOnAction((ActionEvent e) ->{
main.logOut();
});
Button register = new Button("Register");
hbox.getChildren().add(register);
return hbox;
}
}
J'ai essayé recherche aussi une différence entre les méthodes et leur mise en œuvre dans les travailleurs et celui qui ne fonctionne pas. Ne peut toujours pas trouver la raison.
EDIT: Désolé, je n'ai pas remarqué que je n'ai pas mis la classe ProfileInfoScreen. Le voici:
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import jedzenie.app.App;
public class ProfileInfoScreen extends BorderPane {
App main;
Insets ins = new Insets(10,10,10,10);
public ProfileInfoScreen(App main){
this.main = main;
setPadding(ins);
setTop(lbWelcome);
setLeft(vbox());
}
Label lbWelcome = new Label("Welcome, " + "XXXXXXXXXXX");
VBox vbox(){
VBox vbox = new VBox();
vbox.setSpacing(10);
vbox.setPadding(ins);
Button btWeight = new Button("Change weight");
vbox.getChildren().add(btWeight);
btWeight.setOnAction((ActionEvent e) -> {
//XXXXXXXXXX
});
return vbox;
}
}
Où est la source de 'ProfileInfoScreen'? –
J'ai créé une classe 'ProfileInfoScreen' (essentiellement vierge) et votre code a très bien fonctionné. Probablement le problème est dans cette classe. Avez-vous des exceptions? –
Cela marche aussi très bien avec votre 'ProfileInfoScreen'. –