2017-06-13 84 views
0

我想創建一個基本的登錄應用程序,在輸入憑據後,用戶必須進入新的屏幕。JavaFX每次打開新屏幕

但是,當我運行我的應用程序並輸入憑據時,它會進入一個新的屏幕,但我可以看到這是一個新窗口,舊窗口仍然在後臺打開。

下面是我的代碼:

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

} 

能否請你幫我什麼,我做錯了什麼?

+0

請創建一個[MCVE]並將其發佈到問題中,而不是鏈接到代碼。如果鏈接過時,出於任何原因,這個問題就變得對其他用戶無用。 –

+0

@James_D - 我添加了評論,你可以刪除downvote? –

+0

雖然未來,請發佈[MCVE]。你發佈的內容並不是最小的(它包含各種不相關的代碼,比如與你提問無關的數據庫連接)並且不完整(它不能被複制,編譯和按原樣運行)。 –

回答

0

好吧,你做錯了事情: 在你的登錄控制器,你創建一個完整的Stage類的新實例。當你創建新的舞臺時,它會顯示在新窗口中,所以你有兩個選擇。或者在加載新舞臺時關閉舊舞臺,或者訪問初級舞臺並設置場景。

進入電影的階段,您可以使用下面,這將進入您的登錄階段,但同樣的邏輯可以在初級階段使用:

databaseUserName.getScene.getWindow 

現在你可以使用這個調用.hide()方法這將關閉舞臺,或者你可以在舞臺上設置新場景。

不要忘記你總是可以施放此

databaseUserName.getScene.getWindow 

爲(第一階段),如果你需要,而且,不要試圖進入電影,從初始化,因爲它會返回null。

最後,我建議你使用一些框架,如afterburnerfx,或者任何其他如果你打算用很多場景製作應用程序。

最後,你可以讓你的primaryStage靜態的,而是我針對

我寫了這個從手機強烈建議,任何錯誤很遺憾。如果您需要任何進一步的幫助,請離開。

+0

是的,我決定在整個應用程序中使用我的主要階段。 –

0

您可以使用的LoginController下面的代碼在Java中關閉一個窗口下面一行

mainPageAnchorPane.getScene().getWindow().hide(); 

以前winodw.After stage.show();使用將close.You必須使用的anchorpane該窗口的對象,你想要關閉。