JavaFx - статическая инициализация сцен - PullRequest
0 голосов
/ 25 января 2019

Я хочу создать конечный класс, имеющий только статические методы - экземпляр этого класса не понадобится - это должен быть статический контейнер.Предполагается, что в этом классе есть поле карты, содержащее созданных сцен .Теперь проблема заключается в том, что метод 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 Ответ

0 голосов
/ 25 января 2019

Если вам нужен только доступ к определенному экземпляру 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 всем нуждающимся в нем классам ... (Хорошим вариантом может быть рассмотрение внедрения зависимостей.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...