2016-12-16 4 views
0

Я пишу простое приложение JavaFX, которое состоит из трех этапов: Login, Register (Anmeldung) и Welcome (Anwendung). Извините за немецкие наречия!Управление различными этапами JavaFX через слайдер слайдов

Я создал каждый этап и его сцену в классе App и событиях обработки в классе Controller и в проектах в файлах fxml. Мне нужно реализовать класс MainApp, который должен управлять связью между окнами Login, Anmeldung и Anwendung.

MainApp должен сначала запустить Login окно, а затем там, если флажок установлен, то MainApp должен быть уведомлен и заказать запуск Anmeldung окна. После успешной регистрации MainApp должен закрыть окно Anmeldung и снова показать окно Login. Там, когда пользователь входит в систему, MainApp должен снова закрыть окно Login и заказать запуск для окна Anwendung.

enter image description here

Я сделал переход между Login и Anmeldung окна путем изменения LoginController, которое не должно быть сделано там и должно быть сделано с помощью MainApp.

Кроме того, задача состоит в том, чтобы все это выполнялось только с одним 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(); 
    } 
} 

Конечно другие аспекты программы, такие как исключения и создание/чтение/удаление пользователей и т.д. выходит за рамки данного вопроса!

+1

Почему вы используете 'CheckBox' для пользователя, чтобы определить, он хочет перейти на регистрацию, если имя пользователя и пароль должны быть введены еще раз в окне регистрации? Обычно вы ожидаете кнопку или гиперссылку ... – fabian

+0

Я поменяю ее на кнопку позже, но теперь это не важно ... – Bahador

ответ

1

Вот основная идея, которая должна вам начать:

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!"); 

    } 

} 

и теперь в вашем MainApp вы можете сделать:

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

Я реконструировал все свое приложение, но спасибо, подсказки, где полезно;) – Bahador

Смежные вопросы