Использование контроллера сцены для переключения объектов сцены в JavaFX из класса вне моего основного класса и без FXML? - PullRequest
0 голосов
/ 07 декабря 2018

Я пишу проект JavaFX, в котором каждая сцена создается со своим собственным классом и объектом.

Это создает проблему, поскольку я хочу, чтобы каждая из этих сцен могла переключаться на другие сцены в программе.

Я уже использую одну глобальную переменную (класс Organizer, указанный ниже) для обработки зависимостей в моей программе, и я бы предпочел не использовать две.

Я также не хочу использовать какой-либо FXML или что-либо, кроме Native Java и JavaFX.

Как я могу переключать сцены в классах Java за пределами моего основного класса, не создаваявторая глобальная переменная, создание всех моих объектов Pane в моем главном классе или использование FXML?

мой основной класс:

package mainPackage;

import screens.*;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.Pane;

/**
 * Creates Global Variable Organizer
 * Organizer keeps track of various objects
 * 
 * @author LuminousNutria
 */
public class Main extends Application {
   // create initial Pane and Scene
   private Pane mainMenu = new MainMenu().getPane();
   private Scene initialScene = new Scene(mainMenu, 1600, 900);

   // create global Organizer object
   public static Organizer organ = new Organizer();

   @Override
   public void start(Stage stage) {

      organ.setMain(initialScene);

      stage.setScene(initialScene);

      stage.show();
   }

   public static void main(String[] args) {

      launch(args);
   }

//   public getScene = 
}

MyКласс организатора:

package mainPackage;

import java.util.HashMap;

import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import screens.*;

/**
 * Keeps track of everything that needs keeping track of.
 * 
 * That includes: Regions Armor Weapons Goods Player gold
 */
public class Organizer {

   // create screen Pane
   private Pane hideout = new Hideout().getPane();

   // create ScreenController object
   private ScreenController sc;

   /**
    * Should only be called once, when the game starts.
    */
   public Organizer() {

      // Create ScreenController and add Panes.
      sc = new ScreenController();
      sc.addScreen("hideout", hideout);
   }

   public void setMain(Scene main) {
      sc.main = main;
   }


   private class ScreenController {
      // holds all the different Panes to be used as Scenes
      private HashMap<String, Pane> screenMap = new HashMap<>();
      // the scene currently displayed
      private Scene main;

      private ScreenController() {}

      // adds a screen to the HashMap
      private void addScreen(String name, Pane pane) {
         screenMap.put(name, pane);
      }

      // removes a screen from the HashMap
      private void removeScreen(String name) {
         screenMap.remove(name);
      }

      // Replaces the root of the scene currently displayed, with another
      private void activate(String name) {
         main.setRoot(screenMap.get(name));
      }

      // Checks to see if a screen is already in the HashMap
      private boolean checkForKey(String key) {
         return screenMap.containsKey(key);
      }
   }

}
...