JavaFX从Controller(Singleton)访问ui元素

 kakeru0o0 发布于 2023-02-08 14:32

我在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 List tabNames = 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);              
            }
        });
    }
}

addMusicFolderTabthread用于扫描文件和目录的方法调用该方法.

在initialize方法中,我可以访问ui元素,但是在方法中addMusicFolderTab,从filescanner-thread调用,变量musicTabsnull.这是一个例外:

java.lang.NullPointerException
    at de.roth.jsona.javafx.ViewManagerFX$3.run(ViewManagerFX.java:110)

我不知道为什么我无法从initialize方法之外访问TabPane.

1 个回答
  • 除了这里使用的许多可疑模式之外,问题在于你的ViewManagerFX单例(除了不是单例之外)从未设置过它的实例.

    使用FXML时,Controller会动态地创建和加载Controller FXMLoader.

    通过调用ViewManagerFX.getInstance(),您可以访问与创建的控制器不同的控制器FXMLoader.您访问的实例是在此处创建的实例:

    private static ViewManagerFX instance = new ViewManagerFX();
    

    解决问题的最快方法是设置实例,initialize()因为它是由FXMLoader实例创建的实例调用的FXMLoader.

    public void initialize() {
        instance = this;
        // Volume
        ...
    }
    

    2023-02-08 14:39 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有