JavaFx-以静态方式初始化场景

JavaFx-以静态方式初始化场景,javafx,static,scene,initializer,Javafx,Static,Scene,Initializer,我想创建一个只有静态方法的最终类——不需要这个类的实例——它应该是一个静态容器。这个类应该有一个包含创建的场景的地图字段。现在的问题是-methodgetClass()不是静态的,我不能将它包含在静态初始化程序块中。有没有一种不用非静态方法从FXML文件创建场景的方法 代码如下: package gui; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import j

我想创建一个只有静态方法的最终类——不需要这个类的实例——它应该是一个静态容器。这个类应该有一个包含创建的场景的地图字段。现在的问题是-method
getClass()
不是静态的,我不能将它包含在静态初始化程序块中。有没有一种不用非静态方法从FXML文件创建场景的方法

代码如下:

package gui;

import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;

import java.util.Map;
import java.util.TreeMap;

public class ViewManager {

    /**
     * Class containing constant height and width of the window. 
     */
    public static final class Bounds{
        public static final int HEIGHT = 800;
        public static final int WIDTH = 800;
    }

    /**
     * Enum class containing paths to following scenes. 
     */
    public enum SceneName{
        LOGIN_VIEW("/login_view.fxml"),
        MAIN_VIEW("/main_view.fxml");

        private String path;

        SceneName(String path) {
            this.path = path;
        }

        @Override
        public String toString() {
            return path;
        }
    }

    private static Map<SceneName, Scene> sceneContainer;

    static{
        sceneContainer = new TreeMap<>();

        for(SceneName sceneName : SceneName.values()) {
            //here is the non-static reference
            Parent root = FXMLLoader.load(getClass().getResource(SceneName.LOGIN_VIEW.toString())); 
            sceneContainer.put(SceneName.LOGIN_VIEW, new Scene(root, Bounds.HEIGHT, Bounds.WIDTH));
        }
    }

    public static Map<SceneName, Scene> getSceneContainer() {
        return sceneContainer;
    }

}
packagegui;
导入javafx.fxml.fxmloader;
导入javafx.scene.Parent;
导入javafx.scene.scene;
导入java.util.Map;
导入java.util.TreeMap;
公共类视图管理器{
/**
*类包含窗口的恒定高度和宽度。
*/
公共静态最终类边界{
公共静态最终内部高度=800;
公共静态最终整数宽度=800;
}
/**
*包含以下场景路径的枚举类。
*/
公共枚举场景名称{
登录视图(“/LOGIN\u VIEW.fxml”),
MAIN_视图(“/MAIN_VIEW.fxml”);
私有字符串路径;
场景名称(字符串路径){
this.path=path;
}
@凌驾
公共字符串toString(){
返回路径;
}
}
私有静态地图场景容器;
静止的{
sceneContainer=newtreemap();
对于(SceneName SceneName:SceneName.values()){
//这里是非静态引用
父根=FXMLLoader.load(getClass().getResource(SceneName.LOGIN\u VIEW.toString());
sceneContainer.put(SceneName.LOGIN_视图,新场景(根、边界、高度、边界、宽度));
}
}
公共静态映射getSceneContainer(){
返回场景接收器;
}
}

如果您只需要访问某个
实例,只需使用
ClassName.Class

// also changed this to use the loop variable instead of loading the same scene twice
Parent root = FXMLLoader.load(ViewManager.class.getResource(sceneName.toString()));
sceneContainer.put(sceneName, new Scene(root, Bounds.HEIGHT, Bounds.WIDTH));

但是,通常应避免过于频繁地使用
静态
。单身汉可能是更好的选择。如果您能够将
ViewManager
实例传递给所有需要它的类,那就更好了。。。(看看依赖注入可能是个好主意。)

ViewManager.class.getResource(..)应该可以工作。但是为什么要使用静态类呢?单身人士是。。邪恶,通常;)为什么是静态的?有了它,我可以轻松地在任何类的场景之间切换,例如按下按钮,或者当我的线程被中断时,等等:)