JavaFx-以静态方式初始化场景
我想创建一个只有静态方法的最终类——不需要这个类的实例——它应该是一个静态容器。这个类应该有一个包含创建的场景的地图字段。现在的问题是-methodJavaFx-以静态方式初始化场景,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
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(..)应该可以工作。但是为什么要使用静态类呢?单身人士是。。邪恶,通常;)为什么是静态的?有了它,我可以轻松地在任何类的场景之间切换,例如按下按钮,或者当我的线程被中断时,等等:)