代码之家  ›  专栏  ›  技术社区  ›  Embid123

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

  •  0
  • Embid123  · 技术社区  · 7 年前

    我想创建一个只有静态方法的最终类——不需要这个类的实例——它应该是一个静态容器。这个类应该有一个包含 创建 场景 . 现在问题是-方法 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;
        }
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   fabian    7 年前

    如果你只需要访问某个 Class 实例,简单使用 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));
    

    一般使用 static 不过,应该避免太频繁。单件可能是更好的选择。如果你能通过 ViewManager 所有需要它的类的实例…(看看依赖注入可能是个好主意。)

    推荐文章