Есть ли способ сохранить те же атрибуты контроллера файлов 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();
}
Итак, я ожидаю, что при нажатии на соответствующую кнопку движок сохраняет те же значения на любом экране.