Как сохранить атрибуты контроллера после переключения файлов FXML? - PullRequest
0 голосов
/ 28 апреля 2019

Есть ли способ сохранить те же атрибуты контроллера файлов FXML после переключения файла FXML (все файлы FXML имеют один и тот же контроллер)?

Проще говоря, я делаю игру Simon Says с графическим интерфейсом, используя JavaFX, поэтому в качестве своего рода Back-End я создал «Game-Engine», который обслуживает все внутренние функции игры. Итак, поскольку игра запланирована, у меня есть несколько экранов, которые в зависимости от настроек, которые были выбраны на предыдущих экранах, этот движок настраивается. Из-за удобства дизайна я разработал несколько экранов в разных файлах FXML, используя Scene Builder, все из которых используют один и тот же контроллер; дело в том, что при переключении файла 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();
    }    

Итак, я ожидаю, что при нажатии на соответствующую кнопку движок сохраняет те же значения на любом экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...