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()方法获取子项?
答案 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"
作为外观的ScrollPane
和ScrollPaneSkin
的内部实现。如果要更改外观,请小心,这可以通过代码,FXML或CSS来完成。并且在更改JavaFX版本时要小心;我使用Java 8u202尝试了上面的示例,尽管看起来JavaFX 11.0.2并没有改变任何相关内容。