java - fxml 加载后获取节点的子节点

标签 java javafx

我的滚动 Pane 有这个问题,内容模糊,我设法像这样修复它:

        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()方法中立即获取子元素?

最佳答案

您应该通过监听器来执行此操作,而不是尝试等待一定的时间。你听什么取决于你。一种选择是监听 ScrollPaneskin 属性。

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 的子级并在添加适当的节点时使用react。查看源代码,该节点是 StackPane 的匿名子类,其样式类为 "viewport"

请注意,此代码依赖于使用 ScrollPaneSkin 作为外观的 ScrollPane 以及 ScrollPaneSkin 的内部实现。如果您更改皮肤,请务必小心,这可以通过代码、FXML 或 CSS 来完成。更改 JavaFX 版本时要小心;我使用 Java 8u202 尝试了上面的示例,尽管 JavaFX 11.0.2 看起来没有任何相关更改。

关于java - fxml 加载后获取节点的子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54888992/

相关文章:

java - 将一串数字从已解析字符串的一部分更改为 int

java - 修改 ArrayList<JPanel> 中所有 JPanel 的字体大小

java - 基本 javafx 应用程序中由 NullPointer 引起的 InvocationTargetException

java - javax.servlet.http.Part 代表什么?

java - 从通过 NFC 接收的 NDEF 消息中获取文本

java - 在 Sonar 上发布 JUnit 测试报告

JavaFX 虚拟键盘

java - 使用一个 Controller 处理多个 JavaFX 按钮

css - Java FX TitledPane .title CSS 选择器

java - 在 JavaFX 中正确旋转 3 轴上的 3D 对象