繁体   English   中英

从另一个 class javafx 打开新的 window

[英]Open new window from another class javafx

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

这个另一个页面在另一个 class 中(我想分开每个视图,因为我会有 8-9 页)。

如果我的第二个 window 代码与第一个代码在同一个 class 中,它工作正常,但我不知道如何调用另一个 class。

这是我的实际代码

// 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;
    }
}

下面的代码工作正常,但正如您所见,第二个视图与登录表单视图位于相同的 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;
    }
}

我已经尝试过类似的事情:

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

但我收到错误消息


    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

甚至像

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

请问有什么提示吗? =)

坦克你的答案它工作正常,这就是我所做的:

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

如您所见,我只是使用简单的 function 创建了一个名为“AffichageParDateDeux”的基本 class。

在登录表单中,单击登录按钮后,我只需创建一个新阶段和一个新场景:

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