我在javafx.fxml文件中有一个javafx设计,其中根元素具有以下属性
fx:controller="de.roth.jsona.javafx.ViewManagerFX"
这个控制器类有一个单独的机制,并与一些ui元素绑定.
public class ViewManagerFX { private static ViewManagerFX instance = new ViewManagerFX(); @FXML private Slider volumeSlider; @FXML private Label volumeLabel; public IntegerProperty volumeValue = new SimpleIntegerProperty(); @FXML private TabPane musicTabs; public ListtabNames = new ArrayList (); public static ViewManagerFX getInstance() { return (instance); } public void initialize() { // Volume volumeSlider.valueProperty().bindBidirectional(volumeValue); volumeLabel.textProperty().bindBidirectional(volumeValue, new Format() { @Override public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { toAppendTo.append(obj); toAppendTo.append("%"); return toAppendTo; } @Override public Object parseObject(String source, ParsePosition pos) { return null; // no need to be implemented } }); volumeValue.set(Config.getInstance().VOLUME); } public void addMusicFolderTab(final String t, final ArrayList items) { Platform.runLater(new Runnable() { @Override public void run() { Tab m = new Tab("Test Tab"); musicTabs.getTabs().add(0, m); } }); } }
addMusicFolderTab
从thread
用于扫描文件和目录的方法调用该方法.
在initialize方法中,我可以访问ui元素,但是在方法中addMusicFolderTab
,从filescanner-thread调用,变量musicTabs
是null
.这是一个例外:
java.lang.NullPointerException at de.roth.jsona.javafx.ViewManagerFX$3.run(ViewManagerFX.java:110)
我不知道为什么我无法从initialize方法之外访问TabPane.
除了这里使用的许多可疑模式之外,问题在于你的ViewManagerFX
单例(除了不是单例之外)从未设置过它的实例.
使用FXML时,Controller会动态地创建和加载Controller FXMLoader
.
通过调用ViewManagerFX.getInstance()
,您可以访问与创建的控制器不同的控制器FXMLoader
.您访问的实例是在此处创建的实例:
private static ViewManagerFX instance = new ViewManagerFX();
解决问题的最快方法是设置实例,initialize()
因为它是由FXMLoader
实例创建的实例调用的FXMLoader
.
public void initialize() { instance = this; // Volume ... }