java - 如何在新的 fxml javaFX0 上重定向用户

标签 java mysql javafx

我试图在用户连接到数据库后重定向用户。

这是我的 Controller ,带有登录方法:

package packages.home;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.TextField;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import static javax.swing.JOptionPane.showMessageDialog;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;


public class Controller extends Thread {

    @FXML
    private Button btnClose;

    @FXML
    private TextField txtUsername;

    @FXML
    private TextField txtPassword;

    @FXML
    private Label lblErrors;

    @FXML
    private Button btnConnect;

    /// --
    Connection laConnection = GestionConnection.getLaConnection();
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;


    public void handleButtonAction(MouseEvent event) throws IOException{

        if (event.getSource() == btnClose) {
            System.exit(0);
            System.out.println("Fermeture de l'application.");
        }

        if (event.getSource() == btnConnect) {

            //login here
            if (logIn().equals("Success")) {
                try {

                    //add you loading or delays - ;-)
                    Node node = (Node) event.getSource();
                    Stage stage = (Stage) node.getScene().getWindow();

                    //stage.setMaximized(true);
                    stage.close();
                    Scene scene = new Scene(FXMLLoader.load(getClass().getResource("Login.fxml")));
                    stage.setScene(scene);
                    stage.show();

                } catch (IOException ex) {
                    System.err.println(ex.getMessage());
                }

            }
        }

    }


    private String logIn() {

        String status = "Success";
        String username = txtUsername.getText();
        String password = txtPassword.getText();

        if(username.isEmpty() || password.isEmpty()) {

            setLblErrors(Color.RED, "Champs vides.");
            status = "Error";

        } else {

            //query
            String sql = "SELECT * FROM admins Where username = ? and password = ?";

            try {

                // On test la requête
                System.out.println("Hello");
                preparedStatement = laConnection.prepareStatement(sql);
                preparedStatement.setString(1, username);
                preparedStatement.setString(2, password);
                resultSet = preparedStatement.executeQuery();

                if (!resultSet.next()) {
                    setLblErrors(Color.TOMATO, "Nom d'utilisateur ou mot de passe incorrect");
                    status = "Error";

                } else {
                    setLblErrors(Color.GREEN, "Authentification réussite, redirection en cours ...");
                    showMessageDialog(null, "Vous êtes bien connecté");
                }




            } catch (SQLException ex) {

                System.err.println(ex.getMessage());
                status = "Exception";
            }
        }
        return status;

    }


    private void setLblErrors(Color color, String text) {
        lblErrors.setTextFill(color);
        lblErrors.setText(text);
        System.out.println(text);
    }

}

这是我的新 fxml Controller :

package packages.home;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.layout.AnchorPane;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

public class DashboardController implements Initializable {

    @FXML
    private AnchorPane rootPane;

    public DashboardController(AnchorPane rootPane) {
        this.rootPane = rootPane;
    }


    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

    }

    @FXML
    private void loadSecond(ActionEvent event) throws IOException{
        AnchorPane pane = FXMLLoader.load(getClass().getResource("dashboard.fxml"));
        rootPane.getChildren().setAll(pane);
    }
}

我确实知道如何在我的第一个 Controller 和新 Controller 之间建立链接。

我是 javaFX 的新手,我很乐意学习有关它的新知识。

预先感谢您的帮助。

最佳答案

静态方式

例如:

 public class Main {
    public static void main(String[] args) { ... }

    public static Scene scene;

    @Override 
    public void start (Stage stage) {
        ...
        scene = new Scene(FXMLoader.load(...)); //Controller fxml
        stage.setScene(scene);
        ...
    }

    public static void setRoot(AnchorPane pane, Parent parent) {
        pane.getChildren().clear();
        scene.setRoot(parent);
    }
}

Controller.java 中创建对正在使用的 AnchorPane@FXML 引用,并将其传递到函数中。

if (connected) {
    Main.setRoot(pane, FXMLoader.load(...)); //new screen fxml
}

编辑:获取引用

public void setRoot(AnchorPane pane, Parent parent) {
    pane.getChildren().clear();
    pane.getScene().setRoot(parent);
}

不要在场景 Controller 的initialize方法中调用getScene(),场景将为null

if (connected) {
    setRoot(pane, FXMLoader.load(...)); //new screen fxml
}

关于java - 如何在新的 fxml javaFX0 上重定向用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60925540/

相关文章:

php - MySQL PHP 查询问题

mysql - SQL查询从3个有关系的表中检索信息

mysql动态建表

JavaFx TextArea 提示文本

java - 背景鼠标光标 (JavaFX)

java - Rest api - 更新资源的单个字段

java - 使用 Kotlin Gradle DSL 向 Kotlin 项目添加集成测试

css - 如何消除 JavaFX 自定义控件中的这些 CSS 警告?

java - 保存字段时更新时间

Java-调用对象数组的整数部分