我在 javafx.fxml 文件中有 javafx design ,其中根元素具有以下属性
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 List<StringProperty> tabNames = new ArrayList<StringProperty>();
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<MusicListItem> items) {
Platform.runLater(new Runnable() {
@Override
public void run() {
Tab m = new Tab("Test Tab");
musicTabs.getTabs().add(0, m);
}
});
}
}
从addMusicFolderTab
调用方法thread
,用于扫描文件和目录。
在initialize方法中,我可以访问ui-elements,但在方法addMusicFolderTab
中,从filescanner-thread调用,变量musicTabs
为null
。这是一个例外:
java.lang.NullPointerException
at de.roth.jsona.javafx.ViewManagerFX$3.run(ViewManagerFX.java:110)
我不知道为什么我无法从initialize方法之外访问TabPane。
答案 0 :(得分:6)
除了这里使用的许多可疑模式之外,问题在于你的ViewManagerFX
单例(除了不是单例之外)从未设置其实例。
使用FXML时,Controller会由FXMLoader
通过调用ViewManagerFX.getInstance()
,您可以访问与FXMLoader
创建的控制器不同的控制器。您访问的实例是在此处创建的实例:
private static ViewManagerFX instance = new ViewManagerFX();
解决问题的最快方法是在initialize()
中设置实例,因为FXMLoader
创建的实例上FXMLoader
调用了该实例。
public void initialize() {
instance = this;
// Volume
...
}