JavaFX SetOnCloseRequest()关闭所有屏幕
在我的应用程序中,我有多个.fxml文件。在应用程序中设置屏幕时,我还设置了JavaFX SetOnCloseRequest()关闭所有屏幕,java,javafx,Java,Javafx,在我的应用程序中,我有多个.fxml文件。在应用程序中设置屏幕时,我还设置了SetOnCloseRequest()方法。对于某些屏幕,该方法中的代码只是切换到另一个屏幕。例如:当我打开我的创建银行屏幕并按下关闭按钮时,我想切换回我的管理银行屏幕。但当我按下关闭按钮时,它似乎正确地切换了屏幕,但由于某种原因,在关闭管理银行屏幕后不久,应用程序不会停止运行。所以在那之后我什么都做不了,因为我没有GUI。 有人知道如何确保管理银行屏幕不关闭吗 下面是我使用SetOnCloseRequest()方法的主
SetOnCloseRequest()
方法。对于某些屏幕,该方法中的代码只是切换到另一个屏幕。例如:当我打开我的创建银行
屏幕并按下关闭按钮时,我想切换回我的管理银行
屏幕。但当我按下关闭按钮时,它似乎正确地切换了屏幕,但由于某种原因,在关闭管理银行
屏幕后不久,应用程序不会停止运行。所以在那之后我什么都做不了,因为我没有GUI。
有人知道如何确保管理银行
屏幕不关闭吗
下面是我使用SetOnCloseRequest()
方法的主类:
public class ClientMain extends Application {
public static String screenCreateBankId = "createBank";
public static String screenCreateBankFile = "Screens/createBank.fxml";
public static String screenCreateBankAccountId = "createBankAccount";
public static String screenCreateBankAccountFile = "Screens/createBankAccount.fxml";
public static String screenLoginId = "login";
public static String screenLoginFile = "Screens/login.fxml";
public static String screenManageBanksId = "manageBanks";
public static String screenManageBanksFile = "Screens/manageBanks.fxml";
private static Stage primaryStage;
private static ScreensController mainContainer;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
ClientMain.primaryStage = primaryStage;
mainContainer = new ScreensController();
mainContainer.loadScreen(ClientMain.screenCreateBankId, ClientMain.screenCreateBankFile);
mainContainer.loadScreen(ClientMain.screenLoginId, ClientMain.screenLoginFile);
mainContainer.loadScreen(ClientMain.screenManageBanksId, ClientMain.screenManageBanksFile);
mainContainer.setScreen(ClientMain.screenLoginId);
Group root = new Group();
root.getChildren().addAll(mainContainer);
primaryStage.setResizable(false);
primaryStage.getIcons().add(new Image("file:assets/ideal_logo.jpg"));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
public static void setProperties(String name){
primaryStage.sizeToScene();
primaryStage.centerOnScreen();
switch (name){
case "createBank":
primaryStage.setTitle("Create Bank");
primaryStage.setOnCloseRequest(event -> mainContainer.setScreen(screenManageBanksId));
break;
case "login":
primaryStage.setTitle("Login");
primaryStage.setOnCloseRequest(event -> System.exit(0));
break;
case "manageBanks":
primaryStage.setTitle("Manage Banks");
primaryStage.setOnCloseRequest(event -> mainContainer.getManageBanksController().logoutAdmin());
break;
}
}
}
这是我的ScreensController
类:
public class ScreensController extends StackPane {
private HashMap<String, Node> screens = new HashMap<>();
private Client client;
private NewTransactionController newTransactionController;
private BankAccountController bankAccountController;
private ManageBanksController manageBanksController;
public Client getClient() {
return this.client;
}
public NewTransactionController getNewTransactionController() {
return this.newTransactionController;
}
public BankAccountController getBankAccountController() {
return this.bankAccountController;
}
public ManageBanksController getManageBanksController() {
return this.manageBanksController;
}
public ScreensController() {
try {
this.client = new Client();
System.out.println("Client: Client created");
} catch (RemoteException e) {
System.out.println("Client: Cannot create Client");
System.out.println("Client: RemoteException: " + e.getMessage());
System.exit(0);
}
}
public void addScreen(String name, Node screen) {
screens.put(name, screen);
}
public void loadScreen(String name, String resource) {
try {
FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
Parent loadScreen = myLoader.load();
IControllers myScreenController = myLoader.getController();
if (myScreenController instanceof NewTransactionController) {
this.newTransactionController = (NewTransactionController) myScreenController;
} else if (myScreenController instanceof BankAccountController) {
this.bankAccountController = (BankAccountController) myScreenController;
} else if (myScreenController instanceof ManageBanksController) {
this.manageBanksController = (ManageBanksController) myScreenController;
}
myScreenController.setScreenParent(this);
addScreen(name, loadScreen);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setScreen(final String name) {
if (screens.get(name) != null) {
if (!getChildren().isEmpty()) {
getChildren().remove(0);
getChildren().add(0, screens.get(name));
ClientMain.setProperties(name);
} else {
//First time start up
getChildren().add(screens.get(name));
ClientMain.setProperties(name);
}
} else {
System.out.println("Screen hasn't been loaded!!!");
}
}
}
公共类屏幕控制器扩展StackPane{
私有HashMap screens=newhashmap();
私人客户;
专用新交易控制器新交易控制器;
私人银行账户控制人银行账户控制人;
私人管理银行控制器管理银行控制器;
公共客户端getClient(){
将此文件退还给客户;
}
公共NewTransactionController getNewTransactionController(){
返回此.newTransactionController;
}
公共BankAccountController getBankAccountController(){
返回此.bankAccountController;
}
public ManageBanksController getManageBanksController(){
返回此.manageBanksController;
}
公共屏幕控制器(){
试一试{
this.client=新客户端();
System.out.println(“客户机:创建的客户机”);
}捕获(远程异常){
System.out.println(“客户端:无法创建客户端”);
System.out.println(“客户端:RemoteException:+e.getMessage());
系统出口(0);
}
}
公共void addScreen(字符串名称、节点屏幕){
屏幕。put(名称、屏幕);
}
公共void加载屏幕(字符串名称、字符串资源){
试一试{
FXMLLoader myLoader=新的FXMLLoader(getClass().getResource(resource));
父loadScreen=myLoader.load();
IControllers myScreenController=myLoader.getController();
if(新TransactionController的myScreenController实例){
this.newTransactionController=(newTransactionController)myScreenController;
}else if(BankAccountController的myScreenController实例){
this.bankAccountController=(bankAccountController)myScreenController;
}else if(myScreenController实例of manageBanks控制器){
this.manageBanksController=(manageBanksController)myScreenController;
}
myScreenController.setScreenParent(此);
addScreen(名称、加载屏幕);
}捕获(例外e){
e、 printStackTrace();
}
}
公共无效设置屏幕(最终字符串名称){
if(screens.get(name)!=null){
如果(!getChildren().isEmpty()){
getChildren().remove(0);
getChildren().add(0,screens.get(name));
setProperties(名称);
}否则{
//首次启动
getChildren().add(screens.get(name));
setProperties(名称);
}
}否则{
System.out.println(“屏幕尚未加载!!!”;
}
}
}
试试这个
primaryStage.setOnCloseRequest(event -> {
event.consume();
mainContainer.setScreen(screenManageBanksId);
});
...
primaryStage.setOnCloseRequest(event -> {
event.consume();
mainContainer.getManageBanksController().logoutAdmin();
});