Gérer différentes étapes JavaFX via un slass signle


J'écris une application JavaFX simple qui a trois étapes: Login, Register (Anmeldung) et Welcome (Anwendung). Désolé pour les noms allemands!

J'ai créé chaque étape et sa scène dans une classe App et la gestion des événements dans une classe Controller et les conceptions dans les fichiers fxml. J'ai besoin d'implémenter une classe MainApp qui doit gérer la communication entre Login, Anmeldung et Anwendung fenêtres.

Le {[9] } devrait initialement lancer une fenêtre Login puis y entrer si la case à cocher est cochée, le MainApp doit être notifié et ordonner le lancement de la fenêtre Anmeldung. Après un enregistrement réussi, le MainApp doit fermer la fenêtre Anmeldung et afficher à nouveau la fenêtre Login. Là, lorsque l'utilisateur se connecte, le MainApp doit à nouveau fermer la fenêtre Login et ordonner un lancement pour la fenêtre Anwendung.

entrez la description de l'image ici

J'ai fait la transition entre Login et Anmeldung windows en modifiant le LoginController, ce qui ne devrait pas être fait là et doit être accompli via le MainApp.

De plus, la tâche veut que le tout soit fait avec un seul launch(args).

LoginController.java :

package controller;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Modality;
import javafx.stage.Stage;
import resources.Benutzer;

public class LoginController {

  // private static MainApp mainApp;

  @FXML
  public TextField textFieldUserId;

  @FXML
  public PasswordField passwordFieldPasswort;

  @FXML
  public CheckBox checkBoxNeuAnmeldung;

  @FXML
  public Button buttonEinloggen;

  private boolean neuAnmeldung = false;

  // public void setCallBack(MainApp mainApp) {
  // LoginController.mainApp = mainApp;
  // }

  @FXML
  public void handleButtonEinloggenAction(ActionEvent event) throws Exception {
    // Stage stage = (Stage) buttonEinloggen.getScene().getWindow();
    if (neuAnmeldung == false) {
      Benutzer benutzer = new Benutzer(textFieldUserId.getText(),
          passwordFieldPasswort.getText());
      Parent anwendungsScene = FXMLLoader
          .load(getClass().getResource("/design/Anwendung.fxml"));
      Stage anwendungsStage = new Stage();
      ((Node) (event.getSource())).getScene().getWindow().hide();
      anwendungsStage.setScene(new Scene(anwendungsScene));
      anwendungsStage.setTitle("Anmeldung");
      anwendungsStage.show();
      System.out.println(benutzer);

    }

    // stage.close();
    System.out.println("Eingeloggt!");

  }

  @FXML
  public void handleCheckBoxNeuAnmeldungAction(ActionEvent event)
      throws Exception {
    if (checkBoxNeuAnmeldung.isSelected()) {
      neuAnmeldung = true;
      Parent anmeldungsScene = FXMLLoader
          .load(getClass().getResource("/design/Anmeldung.fxml"));
      Stage anmeldungsStage = new Stage();
      anmeldungsStage.initModality(Modality.WINDOW_MODAL);
      anmeldungsStage
          .initOwner(((Node) (event.getSource())).getScene().getWindow());
      anmeldungsStage.setScene(new Scene(anmeldungsScene));
      anmeldungsStage.setTitle("Anmeldung");
      anmeldungsStage.show();

    } else
      neuAnmeldung = false;
    System.out.println("Neu-Anmeldung? " + neuAnmeldung);

  }

}

AnmeldungsController.java:

package controller;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import resources.Benutzer;

public class AnmeldungsController {

  // private static MainApp mainApp;

  @FXML
  public TextField textFieldUserId;

  @FXML
  public PasswordField passwordFieldPasswort;

  @FXML
  public PasswordField passwordFieldWiederholung;

  @FXML
  public Button buttonAnmelden;

  // public void setCallBack(MainApp mainApp) {
  // AnmeldungsController.mainApp = mainApp;
  // }

  @FXML
  public void handleButtonAnmeldenAction(ActionEvent event) {
    Stage stage = (Stage) buttonAnmelden.getScene().getWindow();

    if (passwordFieldPasswort.getText()
        .equals(passwordFieldWiederholung.getText())) {
      Benutzer benutzer = new Benutzer(textFieldUserId.getText(),
          passwordFieldPasswort.getText());
      System.out.println(benutzer);
      System.out.println("Angemeldet!");
      stage.close();

    } else {
      textFieldUserId.setText("Passwörter stimmen nicht überein!");
      System.out.println("Passwörter stimmen nicht überein!");
      System.out.println(passwordFieldPasswort.getText() + " != "
          + passwordFieldWiederholung.getText());

    }

  }

}

AnwendungsController.java:

package controller;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.stage.Stage;

public class AnwendungsController {

  // private static MainApp mainApp;

  @FXML
  public Button buttonSchliessen;

  // public void setCallBack(MainApp mainApp) {
  // AnwendungsController.mainApp = mainApp;
  // }

  @FXML
  public void handleButtonAbbrechenAction(ActionEvent event) {
    Stage stage = (Stage) buttonSchliessen.getScene().getWindow();
    stage.close();
    System.out.println("Fenster Geschlossen!");

  }

}

MainApp.java:

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MainApp extends Application {

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

  @Override
  public void start(Stage primaryStage) throws Exception {
    FXMLLoader loader = new FXMLLoader(
        getClass().getResource("/design/Login.fxml"));
    Parent root = loader.load();
    primaryStage.setTitle("Benutzerverwaltung");
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
  }
}

Bien sûr, les autres aspects du programme comme les exceptions et la création/lecture/suppression d'utilisateurs, etc. sont hors de la portée de cette question!

Author: Bahador, 2016-12-16

1 answers

Voici l'idée de base qui devrait vous aider à démarrer:

public class LoginController {

  private final ReadOnlyBooleanWrapper loggedIn = new ReadOnlyBooleanWrapper();

  public ReadOnlyBooleanProperty loggedInProperty() {
      return loggedIn.getReadOnlyProperty() ;
  }

  public final boolean isLoggedIn() {
      return loggedInProperty().get();
  }


  @FXML
  public TextField textFieldUserId;

  @FXML
  public PasswordField passwordFieldPasswort;

  @FXML
  public CheckBox checkBoxNeuAnmeldung;

  @FXML
  public Button buttonEinloggen;

  private boolean neuAnmeldung = false;


  @FXML
  public void handleButtonEinloggenAction(ActionEvent event) throws Exception {

    // assuming you verify the login credentials...
    loggedIn.set(true);

    System.out.println("Eingeloggt!");

  }

}

Et maintenant, dans votre MainApp vous pouvez faire:

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MainApp extends Application {

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

  @Override
  public void start(Stage primaryStage) throws Exception {
    FXMLLoader loader = new FXMLLoader(
        getClass().getResource("/design/Login.fxml"));
    Parent root = loader.load();

    LoginController loginController = loader.getController();

    loginController.loggedInProperty().addListener((obs, wasLoggedIn, isNowLoggedIn) -> {
        if (isNowLoggedIn) {
            // user is now logged in, show welcome screen...
        }
    });

    primaryStage.setTitle("Benutzerverwaltung");
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
  }
}
 1
Author: James_D, 2016-12-16 16:17:56