【问题标题】:JavaFx- initializing scenes in a static wayJavaFx - 以静态方式初始化场景
【发布时间】:2019-06-19 02:26:39
【问题描述】:

我想创建一个最终类,只有静态方法——不需要这个类的实例——它应该是一个静态容器。这个类应该有一个包含 created scenes 的地图字段。现在的问题是 - 方法 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;
    }

}

【问题讨论】:

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

标签: javafx static scene initializer


【解决方案1】:

如果您只需要访问某个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 实例传递给所有需要它的类,那就更好了……(看看依赖注入可能是个好主意。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2016-06-28
    • 2019-02-18
    • 1970-01-01
    • 2012-01-01
    • 2020-04-14
    • 2011-01-26
    相关资源
    最近更新 更多