JavaFX Как поместить экземпляр контроллера FXML в HashMap? - PullRequest
0 голосов
/ 23 мая 2018

У меня много FXML с разными контроллерами, и я хочу получить доступ ко всем экземплярам контроллеров в одном классе, используя статические методы.Причина, по которой я это делаю, потому что я хочу изменить интерфейс другого FXML с другого контроллера.Я не уверен, есть ли лучший способ сделать это.Моя проблема в моем классе SceenViews, потому что я не знаю, какой тип данных использовать для хранения экземпляра контроллера FXML в моей переменной controllerMap.

Внутри моего пакета: Main.java, ScreenViews.java, Frame.FXML, FrameController.java, Login.FXML, LoginController.java, Dashboard.FXML, DashboardController.java, Journal.FXML и JournalController.java

Main.java

public class Main extends Application { 
    @Override
    public void start(Stage stage) throws Exception { 
    ScreenViews.loadFXML("Frame", "Frame.fxml");
    ScreenViews.loadFXML("Login", "Login.fxml");
    ScreenViews.loadFXML("Dashboard", "Dashboard.fxml"); 
    ScreenViews.loadFXML("Journal", "Journal.fxml");        
    Scene scene = new Scene((Parent) ScreenViews.getView("Frame"));
    scene.setFill(Color.TRANSPARENT);
    stage.initStyle(StageStyle.TRANSPARENT);
    stage.setScene(scene);
    stage.show();
}    

public static void main(String[] args) {
    launch(args);
}     
}

В моем ScreenViews.java какой тип данных можно использовать для хранения другого экземпляра контроллера в моей переменной controllerMap?

public class ScreenViews {
private static HashMap<String, Node> viewMap = new HashMap<>();
//HASHMAP FOR CONTROLLER INSTANCE
private static HashMap<String, datatype? > controllerMap = new HashMap<>();

public static void addView(String name, Node screen) {
    viewMap.put(name, screen);
}

public static Node getView(String name) {
    return viewMap.get(name);
}   

public static void addController(String name,  datatype? controller) {
    controllerMap.put(name, controller);
}

public static datatype? getController(String name) {
    return controllerMap.get(name);
}

public static boolean loadFXML(String name, String resource) {
    try {
        FXMLLoader fxLoader = new 
        FXMLLoader(ScreenViews.class.getResource(resource));
        Parent loadedFXML = (Parent) fxLoader.load();
        addView(name, loadedFXML);
        addController(name, fxLoader.getController());
        return true;
    } catch (IOException e) {
        System.out.println(e.getMessage());
        return false;
    }
}
}

Пример LoginController.код Java

public class LoginController implements Initializable {

    @Override
    public void initialize(URL url, ResourceBundle rb) {

    } 

    @FXML
    public void frameSetUI(ActionEvent event) {
        ScreenViews.getController("Frame").getFramePane().getChildren().add(ScreenViews.get("Dashboard"));
    }
}

Пример кода FrameController.java

public class FrameController implements Initializable {

    @FXML private StackPane rootPane;
    @FXML private AnchorPane titleBar;
    @FXML private AnchorPane framePane;
    @FXML private Button toDashboard;
    @FXML private AnchorPane mainPane;

    public void initialize(URL url, ResourceBundle rb) { 
    }

    public AnchorPane getFramePane(){
        return framePane;  
    }

}
...