簡體   English   中英

JavaFx-以靜態方式初始化場景

[英]JavaFx- initializing scenes in a static way

我想創建一個只有靜態方法的最終類-不需要此類的實例-它應該是一個靜態容器。 假定此類具有包含創建的 場景的地圖字段。 現在的問題是-方法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;
    }

}

如果只需要訪問某個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實例傳遞給所有需要它的類,那就更好了(看一下依賴注入可能是個好主意。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM