简体   繁体   English

从另一个 class javafx 打开新的 window

[英]Open new window from another class javafx

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'.我有一个用 javafx 制作的登录表单,我想,当我们点击按钮进行连接时,客户会被重定向到另一个“页面”。

This other page is in another class (i want to separate each views because i will have something like 8-9 pages).这个另一个页面在另一个 class 中(我想分开每个视图,因为我会有 8-9 页)。

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.如果我的第二个 window 代码与第一个代码在同一个 class 中,它工作正常,但我不知道如何调用另一个 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.下面的代码工作正常,但正如您所见,第二个视图与登录表单视图位于相同的 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.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?请问有什么提示吗? =) =)

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.如您所见,我只是使用简单的 function 创建了一个名为“AffichageParDateDeux”的基本 class。

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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM