在fxml加载后获取节点的子级

时间:2019-02-26 15:31:30

标签: java javafx

scrollPane出现此问题,内容模糊,我设法像这样修复它:

        Node scrollPaneSkin = menuScroll.getChildrenUnmodifiable().get(0);
        scrollPaneSkin.setCache(false);

我正在获取scrollPane的第一个孩子,它是一个scrollPaneSkin并将其缓存设置为false,但是当我在initialize()中执行它时,该节点仍未呈现或类似的内容,因为我收到了NullPointerException。因此,我正在使用时间表:

    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(15),event -> {
        Node scrollPaneSkin = menuScroll.getChildrenUnmodifiable().get(0);
        scrollPaneSkin.setCache(false);
    }));
    timeline.play();

它正在工作,但是我觉得有更好的方法可以做到。如果我尝试从initialize()中的fxml获取节点的场景,也会发生同样的情况。如何立即使用initialize()方法获取子项?

1 个答案:

答案 0 :(得分:1)

您应该通过侦听器执行此操作,而不是尝试等待一定时间。您所听的内容取决于您。一种选择是监听skin的{​​{1}}属性。

ScrollPane

另一种选择是监听public class Controller { @FXML private ScrollPane sp; @FXML private void initialize() { // may want to remove the listener once it does its job sp.skinProperty().addListener((obs, ov, nv) -> { if (nv != null) { sp.getChildrenUnmodifiable().get(0).setCache(false); } }); } } 的子级,并在添加适当的节点时做出反应。查看源代码,该节点是ScrollPane的匿名子类,其样式类为StackPane

请注意,此代码依赖于使用"viewport"作为外观的ScrollPaneScrollPaneSkin的内部实现。如果要更改外观,请小心,这可以通过代码,FXML或CSS来完成。并且在更改JavaFX版本时要小心;我使用Java 8u202尝试了上面的示例,尽管看起来JavaFX 11.0.2并没有改变任何相关内容。