1

i have a login form made with javafx and i would like to, when we click on the button to connect, the customer is redirected to another 'page'.

This other page is in another class (i want to separate each views because i will have something like 8-9 pages).

It works fine if my second window code is in the same class than the first, but i don't see how to call the other class.

Here is my actual code

// First class, the main

package sample;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;
import javafx.stage.Window;
import views.AffichageSelonDate;
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        // Création du stage
        primaryStage.setTitle("Formulaire de connexion");

        // Création du formulaire
        GridPane gridPane = loginForm();

        // Ajout des composants dans le gridPane
        //components.test test = new components.test();
        //test.UIComponentsBis(gridPane);
        UIComponents(gridPane);

        // Création de la scène
        Scene scene = new Scene(gridPane, 500, 300);

        // On indique au stage d'utiliser cette scène
        primaryStage.setScene(scene);

        // On affiche le stage
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

    private GridPane loginForm() {
        // Création d'une instace du conteneur gridPane
        GridPane gridPane = new GridPane();

        // Centrer le conteneur sur l'écran, verticalement et horizontalement
        gridPane.setAlignment(Pos.CENTER);

        // Met un padding(ecart entre le texte et le rebord)
        gridPane.setPadding(new Insets(40, 40, 40, 40));

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setHgap(10);

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setVgap(10);

        // Ajoute une contrainte sur la 1ere colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnOneConstraints = new ColumnConstraints(100, 100, Double.MAX_VALUE);
        // On aligne tous les élément de la colonne sur la droite
        columnOneConstraints.setHalignment(HPos.RIGHT);

        // Ajoute une contrainte sur la 2eme colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnTwoConstrains = new ColumnConstraints(200,200, Double.MAX_VALUE);
        // On spécifie que si la taille de l'écran est modifier, la colonne 2 grandira hoizontalement
        columnTwoConstrains.setHgrow(Priority.ALWAYS);

        gridPane.getColumnConstraints().addAll(columnOneConstraints, columnTwoConstrains);

        return gridPane;
    }

    private void UIComponents(GridPane gridPane) {
        // Ajout de l'en tête
        Label headerLabel = new Label("Connexion");
        headerLabel.setFont(Font.font("Arial", FontWeight.BOLD, 24));
        gridPane.add(headerLabel, 0, 0, 2, 1);
        GridPane.setHalignment(headerLabel, HPos.CENTER);
        GridPane.setMargin(headerLabel, new Insets(20, 0, 20, 0));

        // Ajout d'un label pour l'identifiant(username)
        Label label_username = new Label("Identifiant");
        gridPane.add(label_username, 0, 1);

        // TextField pour écrire sont nom d'utilisateur(username)
        TextField textField_username = new TextField();
        textField_username.setPrefHeight(40);
        gridPane.add(textField_username, 1, 1);

        // Ajout d'un label pour le mot de passe(password)
        Label label_password = new Label("Mot de passe");
        gridPane.add(label_password, 0, 2);

        // TextField pour écrire sont mot de passe(password)
        PasswordField passwordField_password = new PasswordField();
        passwordField_password.setPrefHeight(40);
        gridPane.add(passwordField_password, 1, 2);

        // Ajout du bouton pour se connecter
        Button button_seConnecter = new Button("Se connecter");
        button_seConnecter.setPrefHeight(40);
        button_seConnecter.setDefaultButton(true);
        button_seConnecter.setPrefWidth(100);
        gridPane.add(button_seConnecter,0, 4, 2, 1);
        GridPane.setHalignment(button_seConnecter, HPos.CENTER);
        GridPane.setMargin(button_seConnecter, new Insets(20, 0, 20, 0));

        button_seConnecter.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                if(textField_username.getText().isEmpty()) {
                    showAlert(Alert.AlertType.ERROR, gridPane.getScene().getWindow(), "Erreur dans le formulaire", "Identifiant vide");
                    return;
                }
                if(passwordField_password.getText().isEmpty()) {
                    showAlert(Alert.AlertType.ERROR, gridPane.getScene().getWindow(), "Erreur dans le formulaire", "Mot de passe vide");
                    return;
                }
            }
        });
    }

    private void showAlert(Alert.AlertType alertType, Window owner, String title, String message) {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.initOwner(owner);
        alert.show();
    }
}
//Second class with the view
package views;

import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;

public class AffichageSelonDate extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Stage stageBis = new Stage();
        Scene sceneBis = new Scene(testPage(), 800, 500);
        stageBis.setScene(sceneBis);
        stageBis.show();
    }

    private GridPane testPage() {
        // Création d'une instace du conteneur gridPane
        GridPane gridPane = new GridPane();

        // Centrer le conteneur sur l'écran, verticalement et horizontalement
        gridPane.setAlignment(Pos.CENTER);

        // Met un padding(ecart entre le texte et le rebord)
        gridPane.setPadding(new Insets(40, 40, 40, 40));

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setHgap(10);

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setVgap(10);

        // Ajoute une contrainte sur la 1ere colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnOneConstraints = new ColumnConstraints(100, 100, Double.MAX_VALUE);
        // On aligne tous les élément de la colonne sur la droite
        columnOneConstraints.setHalignment(HPos.RIGHT);

        // Ajoute une contrainte sur la 2eme colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnTwoConstrains = new ColumnConstraints(200,200, Double.MAX_VALUE);
        // On spécifie que si la taille de l'écran est modifier, la colonne 2 grandira hoizontalement
        columnTwoConstrains.setHgrow(Priority.ALWAYS);

        gridPane.getColumnConstraints().addAll(columnOneConstraints, columnTwoConstrains);

        return gridPane;
    }
}

The code below works fine but as you can see the second view is in the same class than the login form view, i don't want that.

package sample;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;
import javafx.stage.Window;
import views.AffichageSelonDate;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        // Création du stage
        primaryStage.setTitle("Formulaire de connexion");

        // Création du formulaire
        GridPane gridPane = loginForm();

        // Ajout des composants dans le gridPane
        //components.test test = new components.test();
        //test.UIComponentsBis(gridPane);
        UIComponents(gridPane);

        // Création de la scène
        Scene scene = new Scene(gridPane, 500, 300);

        // On indique au stage d'utiliser cette scène
        primaryStage.setScene(scene);

        // On affiche le stage
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

    private GridPane loginForm() {
        // Création d'une instace du conteneur gridPane
        GridPane gridPane = new GridPane();

        // Centrer le conteneur sur l'écran, verticalement et horizontalement
        gridPane.setAlignment(Pos.CENTER);

        // Met un padding(ecart entre le texte et le rebord)
        gridPane.setPadding(new Insets(40, 40, 40, 40));

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setHgap(10);

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setVgap(10);

        // Ajoute une contrainte sur la 1ere colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnOneConstraints = new ColumnConstraints(100, 100, Double.MAX_VALUE);
        // On aligne tous les élément de la colonne sur la droite
        columnOneConstraints.setHalignment(HPos.RIGHT);

        // Ajoute une contrainte sur la 2eme colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnTwoConstrains = new ColumnConstraints(200,200, Double.MAX_VALUE);
        // On spécifie que si la taille de l'écran est modifier, la colonne 2 grandira hoizontalement
        columnTwoConstrains.setHgrow(Priority.ALWAYS);

        gridPane.getColumnConstraints().addAll(columnOneConstraints, columnTwoConstrains);

        return gridPane;
    }

    private void UIComponents(GridPane gridPane) {
        // Ajout de l'en tête
        Label headerLabel = new Label("Connexion");
        headerLabel.setFont(Font.font("Arial", FontWeight.BOLD, 24));
        gridPane.add(headerLabel, 0, 0, 2, 1);
        GridPane.setHalignment(headerLabel, HPos.CENTER);
        GridPane.setMargin(headerLabel, new Insets(20, 0, 20, 0));

        // Ajout d'un label pour l'identifiant(username)
        Label label_username = new Label("Identifiant");
        gridPane.add(label_username, 0, 1);

        // TextField pour écrire sont nom d'utilisateur(username)
        TextField textField_username = new TextField();
        textField_username.setPrefHeight(40);
        gridPane.add(textField_username, 1, 1);

        // Ajout d'un label pour le mot de passe(password)
        Label label_password = new Label("Mot de passe");
        gridPane.add(label_password, 0, 2);

        // TextField pour écrire sont mot de passe(password)
        PasswordField passwordField_password = new PasswordField();
        passwordField_password.setPrefHeight(40);
        gridPane.add(passwordField_password, 1, 2);

        // Ajout du bouton pour se connecter
        Button button_seConnecter = new Button("Se connecter");
        button_seConnecter.setPrefHeight(40);
        button_seConnecter.setDefaultButton(true);
        button_seConnecter.setPrefWidth(100);
        gridPane.add(button_seConnecter,0, 4, 2, 1);
        GridPane.setHalignment(button_seConnecter, HPos.CENTER);
        GridPane.setMargin(button_seConnecter, new Insets(20, 0, 20, 0));

        button_seConnecter.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                if(textField_username.getText().isEmpty()) {
                    showAlert(Alert.AlertType.ERROR, gridPane.getScene().getWindow(), "Erreur dans le formulaire", "Identifiant vide");
                    return;
                }
                if(passwordField_password.getText().isEmpty()) {
                    showAlert(Alert.AlertType.ERROR, gridPane.getScene().getWindow(), "Erreur dans le formulaire", "Mot de passe vide");
                    return;
                }

                showAlert(Alert.AlertType.CONFIRMATION, gridPane.getScene().getWindow(), "Réussi", "Vous avez réussi "+textField_username.getText());
                Stage stageBis = new Stage();
                Scene sceneBis = new Scene(testPage(), 800, 500);
                stageBis.setScene(sceneBis);
                stageBis.show();
            }
        });
    }

    private void showAlert(Alert.AlertType alertType, Window owner, String title, String message) {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.initOwner(owner);
        alert.show();
    }
/**********************************************************/
    private GridPane testPage() {
        // Création d'une instace du conteneur gridPane
        GridPane gridPane = new GridPane();

        // Centrer le conteneur sur l'écran, verticalement et horizontalement
        gridPane.setAlignment(Pos.CENTER);

        // Met un padding(ecart entre le texte et le rebord)
        gridPane.setPadding(new Insets(40, 40, 40, 40));

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setHgap(10);

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setVgap(10);

        // Ajoute une contrainte sur la 1ere colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnOneConstraints = new ColumnConstraints(100, 100, Double.MAX_VALUE);
        // On aligne tous les élément de la colonne sur la droite
        columnOneConstraints.setHalignment(HPos.RIGHT);

        // Ajoute une contrainte sur la 2eme colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnTwoConstrains = new ColumnConstraints(200,200, Double.MAX_VALUE);
        // On spécifie que si la taille de l'écran est modifier, la colonne 2 grandira hoizontalement
        columnTwoConstrains.setHgrow(Priority.ALWAYS);

        gridPane.getColumnConstraints().addAll(columnOneConstraints, columnTwoConstrains);

        return gridPane;
    }
}

I already tried things like :

AffichageSelonDate a = new AffichageSelonDate();
a.start()

but i get error message


    Error:(130, 18) java: method start in class views.AffichageSelonDate cannot be applied to given types;
  required: javafx.stage.Stage
  found:    no arguments
  reason: actual and formal argument lists differ in length

even things like

Stage stageBis = new Stage();
Scene sceneBis = new Scene(AffichageSelonDate().testPage(), 800, 500);
stageBis.setScene(sceneBis);
stageBis.show();
but it won't work

Any tips please ? =)

VongoSanDi
  • 76
  • 7
  • You should only have one `Application` subclass in your application (and one instance of it). It represents the life-cycle of the entire application. You can separate out different parts of the UI into different classes (and use them in any of the usual ways you use any other Java classes), but they should not be subclasses of `Application`. – James_D Apr 29 '20 at 23:00
  • Does https://stackoverflow.com/questions/32464698/java-how-do-i-start-a-standalone-application-from-the-current-one-when-both-are/32465949 answer the question? – James_D Apr 29 '20 at 23:01
  • java naming conventions please! – kleopatra Apr 30 '20 at 00:31

1 Answers1

0

Tanks to your answers it works fine, this is what i did:

// Second class
package views;

import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;

public class AffichageParDateDeux {
    public GridPane testPage() {
        // Création d'une instace du conteneur gridPane
        GridPane gridPane = new GridPane();

        // Centrer le conteneur sur l'écran, verticalement et horizontalement
        gridPane.setAlignment(Pos.CENTER);

        // Met un padding(ecart entre le texte et le rebord)
        gridPane.setPadding(new Insets(40, 40, 40, 40));

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setHgap(10);

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setVgap(10);

        // Ajoute une contrainte sur la 1ere colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnOneConstraints = new ColumnConstraints(100, 100, Double.MAX_VALUE);
        // On aligne tous les élément de la colonne sur la droite
        columnOneConstraints.setHalignment(HPos.RIGHT);

        // Ajoute une contrainte sur la 2eme colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnTwoConstrains = new ColumnConstraints(200, 200, Double.MAX_VALUE);
        // On spécifie que si la taille de l'écran est modifier, la colonne 2 grandira hoizontalement
        columnTwoConstrains.setHgrow(Priority.ALWAYS);

        gridPane.getColumnConstraints().addAll(columnOneConstraints, columnTwoConstrains);

        return gridPane;
    }
}

// First class
package sample;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.stage.Stage;
import javafx.stage.Window;
import views.AffichageParDateDeux;
import views.AffichageSelonDate;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        // Création du stage
        primaryStage.setTitle("Formulaire de connexion");

        // Création du formulaire
        GridPane gridPane = loginForm();

        // Ajout des composants dans le gridPane
        //components.test test = new components.test();
        //test.UIComponentsBis(gridPane);
        UIComponents(gridPane);

        // Création de la scène
        Scene scene = new Scene(gridPane, 500, 300);

        // On indique au stage d'utiliser cette scène
        primaryStage.setScene(scene);

        // On affiche le stage
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

    private GridPane loginForm() {
        // Création d'une instace du conteneur gridPane
        GridPane gridPane = new GridPane();

        // Centrer le conteneur sur l'écran, verticalement et horizontalement
        gridPane.setAlignment(Pos.CENTER);

        // Met un padding(ecart entre le texte et le rebord)
        gridPane.setPadding(new Insets(40, 40, 40, 40));

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setHgap(10);

        // Met un écart HORIZONTAL entre les colonnes
        gridPane.setVgap(10);

        // Ajoute une contrainte sur la 1ere colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnOneConstraints = new ColumnConstraints(100, 100, Double.MAX_VALUE);
        // On aligne tous les élément de la colonne sur la droite
        columnOneConstraints.setHalignment(HPos.RIGHT);

        // Ajoute une contrainte sur la 2eme colonne et tous ses noeuds avec une largeur minimum, une largeur de base et une largeur max
        ColumnConstraints columnTwoConstrains = new ColumnConstraints(200,200, Double.MAX_VALUE);
        // On spécifie que si la taille de l'écran est modifier, la colonne 2 grandira hoizontalement
        columnTwoConstrains.setHgrow(Priority.ALWAYS);

        gridPane.getColumnConstraints().addAll(columnOneConstraints, columnTwoConstrains);

        return gridPane;
    }

    private void UIComponents(GridPane gridPane) {
        // Ajout de l'en tête
        Label headerLabel = new Label("Connexion");
        headerLabel.setFont(Font.font("Arial", FontWeight.BOLD, 24));
        gridPane.add(headerLabel, 0, 0, 2, 1);
        GridPane.setHalignment(headerLabel, HPos.CENTER);
        GridPane.setMargin(headerLabel, new Insets(20, 0, 20, 0));

        // Ajout d'un label pour l'identifiant(username)
        Label label_username = new Label("Identifiant");
        gridPane.add(label_username, 0, 1);

        // TextField pour écrire sont nom d'utilisateur(username)
        TextField textField_username = new TextField();
        textField_username.setPrefHeight(40);
        gridPane.add(textField_username, 1, 1);

        // Ajout d'un label pour le mot de passe(password)
        Label label_password = new Label("Mot de passe");
        gridPane.add(label_password, 0, 2);

        // TextField pour écrire sont mot de passe(password)
        PasswordField passwordField_password = new PasswordField();
        passwordField_password.setPrefHeight(40);
        gridPane.add(passwordField_password, 1, 2);

        // Ajout du bouton pour se connecter
        Button button_seConnecter = new Button("Se connecter");
        button_seConnecter.setPrefHeight(40);
        button_seConnecter.setDefaultButton(true);
        button_seConnecter.setPrefWidth(100);
        gridPane.add(button_seConnecter,0, 4, 2, 1);
        GridPane.setHalignment(button_seConnecter, HPos.CENTER);
        GridPane.setMargin(button_seConnecter, new Insets(20, 0, 20, 0));

        button_seConnecter.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                if(textField_username.getText().isEmpty()) {
                    showAlert(Alert.AlertType.ERROR, gridPane.getScene().getWindow(), "Erreur dans le formulaire", "Identifiant vide");
                    return;
                }
                if(passwordField_password.getText().isEmpty()) {
                    showAlert(Alert.AlertType.ERROR, gridPane.getScene().getWindow(), "Erreur dans le formulaire", "Mot de passe vide");
                    return;
                }

                showAlert(Alert.AlertType.CONFIRMATION, gridPane.getScene().getWindow(), "Réussi", "Vous avez réussi "+textField_username.getText());

                AffichageParDateDeux affichageDeux = new AffichageParDateDeux();
                Scene sceneBis = new Scene(affichageDeux.testPage(), 800, 500);
                Stage stagebis = new Stage();
                stagebis.setScene(sceneBis);
                stagebis.show();
            }
        });
    }

    private void showAlert(Alert.AlertType alertType, Window owner, String title, String message) {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.initOwner(owner);
        alert.show();
    }
}

As you can see i just create a basic class named 'AffichageParDateDeux' with a simple function.

And in the login form, once the log in button is clicked, i just create a new stage and a new scene with :

AffichageParDateDeux affichageDeux = new AffichageParDateDeux();
Scene sceneBis = new Scene(affichageDeux.testPage(), 800, 500);
Stage stagebis = new Stage();
stagebis.setScene(sceneBis);
stagebis.show();
VongoSanDi
  • 76
  • 7
  • still not using java naming conventions always - the sooner you start the sooner you will get accustomed to them :) – kleopatra Apr 30 '20 at 12:17