切换FXML文件后如何保留Controller属性?

时间:2019-04-28 05:00:39

标签: java javafx

切换FXML文件后(所有FXML文件都具有相同的Controller),有什么方法可以保持FXML文件控制器的相同属性?

为了简单起见,我正在使用JavaFX使用GUI制作Simon Says游戏,因此,作为一种后端,我制作了一个“ Game-Engine”,它具有游戏的所有内部功能。因此,随着游戏的计划,我有多个屏幕,这些屏幕取决于在先前屏幕中选择的设置,因此正在配置此引擎。因为设计的舒适性,所以我使用Scene Builder在不同的FXML文件中设计了多个屏幕,所有这些屏幕都使用相同的控制器。问题在于,当切换FXML文件时,控制器将再次重新初始化。控制器将引擎用作属性,因此该引擎会像控制器一样再次重新初始化。因此,我正在寻找一种方法来使引擎保持与第一次初始化时相同的方式。

我将放置控制器类的基本方法,应用程序类除基础知识外没有其他行。

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import javafx.animation.FadeTransition;
import javafx.animation.SequentialTransition;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.shape.Arc;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author etopo
 */
public class Controller implements Initializable  {

    private GameEngine simon = new GameEngine(); //this line was in the first time in the init method.


     /*
      * Method which initialize another screen/FXML File
      */
    @FXML
    private void inicializaUnJugador(ActionEvent event) {
        simon.setMultijugador(false);
        try {
            switchScene(event, "LevelChooser.fxml");
        } catch (IOException ex) {
            System.err.println("Archivo mal definido");
        }
    }

    @FXML
    private void inicializaMultijugador(ActionEvent event){
        simon.setMultijugador(true);
        try{
            switchScene(event, "LevelChooser.fxml");
        } catch (IOException ex){
            System.err.println("Archivo mal definido");
        }
    }

    private void switchScene(ActionEvent event, String url) throws IOException{
        FXMLLoader loader = new FXMLLoader(getClass().getResource(url));
        //loader.setController(this);
        Parent padre = loader.load();
        Scene switcher = new Scene(padre);
        Stage manager = (Stage)((Node)event.getSource()).getScene().getWindow();

        manager.setScene(switcher);
        manager.show();
    }

    @FXML
    private void backToMain(ActionEvent event){
        simon.clear();
        try{
            switchScene(event, "TitlePage.fxml");
        }catch(IOException ex){
            System.err.println("Archivo Mal definido");
        }
    }

    @FXML
    private void EasyGame(ActionEvent event){
        simon.setDificultad(Dificultad.EASY);
        try{
            switchScene(event, "EasyGame.fxml");
        }catch(IOException ex){
            System.err.println("Archivo mal definido");
        }
    }


    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //Font nes = Font.loadFont(Controller.class.getResource("fonts/kongtext.ttf").toExternalForm(), 20);
        //simon = new GameEngine();
    }    

所以我期望的是,当单击相应按钮时,引擎在任何屏幕上都保持相同的值。

0 个答案:

没有答案