afterburner.fx 从节点获取视图

afterburner.fx get view from node

几天来我一直在努力掌握afterburner.fx,但我无法弄清楚这个问题。请帮忙

选项卡窗格中有三个选项卡

tabPane.getTabs().get(0).setContent(new FirstView().getView());
tabPane.getTabs().get(1).setContent(new SecondView().getView());
tabPane.getTabs().get(2).setContent(new ThirdView().getView());

这些没有命名为 firstview、secondview 等。它是为了演示...

现在每个视图都有一个重新加载方法:

firstView.reload()
secondView.reload()
thirdView.reload()

并且我已经为选项卡更改设置了一个侦听器,以便我可以在这些视图进入视图后重新加载它们

tabPane.getSelectionModel().selectedItemProperty().addListener((o, oldValue, newValue) -> {
    newValue.getView().reload(); // of course this cant be done like this
})

如何在选项卡进入视图后重新加载它的视图?

我设法找到了解决方法。我制作了两个新的 类,一个扩展了 FXMLView,另一个扩展了 Tab。

public abstract class ReloadableView extends FXMLView {

    public abstract void reload();

}

public class ReloadingTab<V extends ReloadableView> extends Tab {

    private V view;

    public ReloadingTab(String text, V view) {
        super(text, view.getView());
        this.view = view;
    }

    public V getView() {
        return view;
    }

}

终于添加了监听器

    tabPane.getSelectionModel().selectedItemProperty().addListener((o, oldValue, newValue) -> {
        ReloadingTab tab = (ReloadingTab) newValue;
        tab.getView().reload();
    });

抱歉,如果我的问题没有任何意义。我希望有人觉得这很有用。

您可以将侦听器添加到各个选项卡而不是选项卡窗格:

FirstView firstView = new FirstView();
Tab tab0 = tabs.getTabs().get(0);
tab0.selectedProperty().addListener((obs, wasSelected, isSelected) -> {
    if (isSelected) {
        firstView.reload();
    }
});
tab0.setContent(firstView.getView());

// etc