2017-06-26 2 views
0

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; 

    } 
} 
+0

Où est la source de 'ProfileInfoScreen'? –

+0

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? –

+0

Cela marche aussi très bien avec votre 'ProfileInfoScreen'. –

Répondre

0

Comme l'a commenté par James_D, j'ai essayé votre code et ça marche très bien. Quand je clique sur le bouton d'enregistrement il montre une table avec le nom d'utilisateur, le mot de passe, le sexe, l'âge, les champs d'email. J'ai fait un profileScreen vide, donc en cliquant sur le login une fenêtre vide apparaît. Je ne vois pas de problème. Veuillez vous assurer que toutes vos importations proviennent du paquetage javafx. Juste pour tester, essayez différents IDE (je l'ai essayé sur Intellij).

Impossible de commenter parce que je n'ai pas assez de réputation, donc je l'ai écrit ici.

+0

Je l'ai résolu - le problème était mon ignorance lors de l'exécution du programme. J'ai ignoré l'erreur avec mon fichier pom.xml car je n'avais aucune idée qu'il devait faire quelque chose avec ça. J'utilise Eclipse IDE et il semble qu'il exécute la version précédente du programme (je pense), et il a commencé à fonctionner après avoir résolu le problème avec mon fichier pom.xml. Merci pour vos réponses, beaucoup aidé après avoir vu que cela fonctionne pour tout le monde. –

0

Je connais cette question a été répondu, mais vous pourriez avoir des problèmes avec ne pas avoir stage.show dans votre code après que vous avez vos lignes stage.setScene.