java - StrokeType.OUTSIDE 在 ScrollPane 内的标签上使用时会导致大量滞后

标签 java css javafx

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        ScrollPane scrollPane = new ScrollPane();
        VBox vbox = new VBox();

        for (int i = 0; i < 50; i++) {
            Label label = new Label("Label " + i);
            label.getStyleClass().add("test");
            vbox.getChildren().add(label);
        }

        scrollPane.setContent(vbox);

        Scene scene = new Scene(scrollPane, 500, 500);
        primaryStage.setScene(scene);
        scene.getStylesheets().add("/style.css");
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

样式.css:

.test.label .text {
    -fx-fill: white;
    -fx-stroke: red;
    -fx-stroke-type: outside;
}

JDK 和 JavaFX 13

标签渲染得很好,但当我尝试滚动时,它确实滞后了很多。

我希望它能像不使用 -fx-lines-type: Outside; 时一样平滑,例如,将 style.css 的内容替换为

.test.label .text {
    -fx-fill: white;
    -fx-stroke: red;
    /* -fx-stroke-type: outside; */
}

修复了滚动滞后,但笔画在文本内部绘制时与填充重叠。

我也尝试过使用 Java 和 JavaFX 11 运行,但没有区别。

最佳答案

我研究出了如何在不使用 Nand 的解决方法的情况下获得更好的滚动性能。我使用了这个问题的一些建议:

具体来说,缓存节点的建议:

node.setCache(true);
node.setCacheShape(true);
node.setCacheHint(CacheHint.SPEED);

一旦我将这些函数调用添加到 Nand 测试程序中生成的标签中,滚动性能就非常好(而不是明显令人难以置信的滞后)。

在渲染被缓存之前,场景的初始绘制有点慢(需要一秒钟左右)。如果将标签数量从 50 个增加到 500 个,则可以最好地观察到初始绘制的缓慢程度。但是,一旦绘制了一次场景并缓存了节点,滚动就不再降低应用程序的每秒帧数性能。

在上下文中,这个解决方案是:

public void start(Stage primaryStage) {
    ScrollPane scrollPane = new ScrollPane();
    VBox vbox = new VBox();

    for (int i = 0; i < 500; i++) {
        Label label = new Label("Label " + i);
        label.getStyleClass().add("test");
        vbox.getChildren().add(label);

        label.setCache(true);
        label.setCacheShape(true);
        label.setCacheHint(CacheHint.SPEED);
    }

    scrollPane.setContent(vbox);

    Scene scene = new Scene(scrollPane, 500, 500);
    primaryStage.setScene(scene);
    scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
    primaryStage.show();
}

其中 style.css 是问题中提供的。

要加快场景的初始绘制速度,您可以使用投影效果,它可以模拟轮廓,提供类似的外观。不同的效果设置(例如使用单 channel 框而不是高斯)将提供略有不同的渲染,因此它是可以定制的。

.shadow-outline.label .text {
    -fx-fill: white;
    -fx-effect: dropshadow(gaussian, red, 1, 1.0, 0, 0);
}

关于java - StrokeType.OUTSIDE 在 ScrollPane 内的标签上使用时会导致大量滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59569640/

相关文章:

java - 带谓词的生产者-消费者

java - JAXB2 为可选属性生成具有原始类型的 getter/setter

css - 添加 Font Awesome 图标内联但上标与其他元素

maven - 如何让 javafx 类进入运行时?

java - ImageView 找不到图片网址

java - 为什么 ListChangeBuilder 会抛出 NullPointerException?

java - 为什么Java Reflect可以访问私有(private)字段/方法?

c# - 我可以执行一个try block 对应的多个catch block 吗?

css - 如何修复 Windows 上异常字符的等宽间距?

jquery - 如何在 jQuery Mobile 中禁用可折叠的标题按钮?