JavaFX 每次都打开新屏幕
JavaFX opening new screens everytime
我正在尝试创建一个基本的登录应用程序,在输入凭据后,用户必须被带到一个新屏幕。
但是当我 运行 我的应用程序并输入凭据时,它会转到一个新屏幕,但我可以看到这是一个新的 window 而旧的 window 仍然是在后台打开。
下面是我的代码:
package com.gsx.controller;
import java.io.IOException;
import java.util.logging.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import application.Main;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class LoginController {
private Scene scene;
@FXML
private TextField databaseUserName;
@FXML
private TextField databasePassword;
@FXML
private AnchorPane mainPageAnchorPane;
private static SessionFactory sessionFactory = null;
//Controller method to handle the click of the Database Login button
//This method needs to try and setup a database connection based on the credentials provided
//and advance to the next stage if it is successfull in establishing the connection
//If the credentials entered are incorrect an error message must be displayed and the
//control must remain in the same page.
@FXML
public void handleLoginButtonClick(ActionEvent actionEvent){
Session session = null;
try{
Configuration configuration = new Configuration();
//configuration.configure("applicationConfig.xml");
configuration.configure("applicationConfig.xml");
configuration.setProperty("hibernate.connection.username",databaseUserName.getText());
configuration.setProperty("hibernate.connection.password",databasePassword.getText());
System.out.println("Configuration was successful");
System.out.println(configuration.getProperty("connection.username"));
System.out.println(configuration.getProperty("hibernate.connection.password"));
//Create the session factory
sessionFactory = configuration.buildSessionFactory();
//Get the session object
session = sessionFactory.getCurrentSession();
//Begin the transaction
Transaction transaction = session.beginTransaction();
System.out.println("Connection successful");
//some problem here debug this tomorrow
AnchorPane root = new AnchorPane();
Scene scene = new Scene(root,650,800);
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/com/gsx/frontend/mainPage.fxml"));
System.out.println(fxmlLoader);
scene.setRoot((Parent)fxmlLoader.load());
Main.stage.setScene(scene);
Main.stage.show();
}
catch(Exception exception){
exception.printStackTrace();
Alert alert = new Alert(AlertType.ERROR, "The login information is incorrect",ButtonType.OK);
alert.setTitle("Invalid Cred!!");
alert.show();
if(alert.getResult() == ButtonType.OK){
}
}
finally{
System.out.println("Finally Block to take care of closing the session and the session Factory");
if(null!=session){
System.out.println("Session is not Null. Closing it");
session.close();
}
}
}
//Method to show the Login Screen
public void showLoginScreen(){
try{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("login.fxml"));
scene.setRoot((Parent)fxmlLoader.load());
}
catch(IOException exception){
Logger.getLogger(LoginController.class.getName());
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
你能帮我看看我做错了什么吗?
您可以在 java 中的 LoginController 中使用以下代码来关闭前一个 winodw.After stage.show();
使用下面的行
mainPageAnchorPane.getScene().getWindow().hide();
您之前的 window 将 close.You 必须使用您要关闭的那个 window 的锚定窗格对象。
好的,所以你做错了:
在您的登录控制器中,您创建了一个完整的新 Stage class 实例。当您创建新阶段时,它会显示在新 window 中,因此您有两个选择。要么在加载新阶段时关闭旧阶段,要么访问主阶段并设置场景。
要访问阶段,您可以使用以下方法,这将访问您的登录阶段,但可以在您的初级阶段使用相同的逻辑:
databaseUserName.getScene.getWindow
现在你可以使用它来调用.hide()方法来关闭舞台,或者你可以在那个舞台上设置新的场景。
别忘了你可以随时施放这个
databaseUserName.getScene.getWindow
到(阶段),如果需要,也不要尝试从初始化访问它,因为它会 return null。
最后,我建议你使用一些框架,比如 afterburnerfx,或者如果你打算制作有很多场景的应用程序。
最后,您可以将 primaryStage 设为静态,但我强烈建议不要这样做
我从 phone 写了这篇文章,如有任何错误,我们深表歉意。如果您需要任何进一步的帮助,请联系我们。
我正在尝试创建一个基本的登录应用程序,在输入凭据后,用户必须被带到一个新屏幕。
但是当我 运行 我的应用程序并输入凭据时,它会转到一个新屏幕,但我可以看到这是一个新的 window 而旧的 window 仍然是在后台打开。
下面是我的代码:
package com.gsx.controller;
import java.io.IOException;
import java.util.logging.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import application.Main;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class LoginController {
private Scene scene;
@FXML
private TextField databaseUserName;
@FXML
private TextField databasePassword;
@FXML
private AnchorPane mainPageAnchorPane;
private static SessionFactory sessionFactory = null;
//Controller method to handle the click of the Database Login button
//This method needs to try and setup a database connection based on the credentials provided
//and advance to the next stage if it is successfull in establishing the connection
//If the credentials entered are incorrect an error message must be displayed and the
//control must remain in the same page.
@FXML
public void handleLoginButtonClick(ActionEvent actionEvent){
Session session = null;
try{
Configuration configuration = new Configuration();
//configuration.configure("applicationConfig.xml");
configuration.configure("applicationConfig.xml");
configuration.setProperty("hibernate.connection.username",databaseUserName.getText());
configuration.setProperty("hibernate.connection.password",databasePassword.getText());
System.out.println("Configuration was successful");
System.out.println(configuration.getProperty("connection.username"));
System.out.println(configuration.getProperty("hibernate.connection.password"));
//Create the session factory
sessionFactory = configuration.buildSessionFactory();
//Get the session object
session = sessionFactory.getCurrentSession();
//Begin the transaction
Transaction transaction = session.beginTransaction();
System.out.println("Connection successful");
//some problem here debug this tomorrow
AnchorPane root = new AnchorPane();
Scene scene = new Scene(root,650,800);
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/com/gsx/frontend/mainPage.fxml"));
System.out.println(fxmlLoader);
scene.setRoot((Parent)fxmlLoader.load());
Main.stage.setScene(scene);
Main.stage.show();
}
catch(Exception exception){
exception.printStackTrace();
Alert alert = new Alert(AlertType.ERROR, "The login information is incorrect",ButtonType.OK);
alert.setTitle("Invalid Cred!!");
alert.show();
if(alert.getResult() == ButtonType.OK){
}
}
finally{
System.out.println("Finally Block to take care of closing the session and the session Factory");
if(null!=session){
System.out.println("Session is not Null. Closing it");
session.close();
}
}
}
//Method to show the Login Screen
public void showLoginScreen(){
try{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("login.fxml"));
scene.setRoot((Parent)fxmlLoader.load());
}
catch(IOException exception){
Logger.getLogger(LoginController.class.getName());
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
你能帮我看看我做错了什么吗?
您可以在 java 中的 LoginController 中使用以下代码来关闭前一个 winodw.After stage.show();
使用下面的行
mainPageAnchorPane.getScene().getWindow().hide();
您之前的 window 将 close.You 必须使用您要关闭的那个 window 的锚定窗格对象。
好的,所以你做错了: 在您的登录控制器中,您创建了一个完整的新 Stage class 实例。当您创建新阶段时,它会显示在新 window 中,因此您有两个选择。要么在加载新阶段时关闭旧阶段,要么访问主阶段并设置场景。
要访问阶段,您可以使用以下方法,这将访问您的登录阶段,但可以在您的初级阶段使用相同的逻辑:
databaseUserName.getScene.getWindow
现在你可以使用它来调用.hide()方法来关闭舞台,或者你可以在那个舞台上设置新的场景。
别忘了你可以随时施放这个
databaseUserName.getScene.getWindow
到(阶段),如果需要,也不要尝试从初始化访问它,因为它会 return null。
最后,我建议你使用一些框架,比如 afterburnerfx,或者如果你打算制作有很多场景的应用程序。
最后,您可以将 primaryStage 设为静态,但我强烈建议不要这样做
我从 phone 写了这篇文章,如有任何错误,我们深表歉意。如果您需要任何进一步的帮助,请联系我们。