繁体   English   中英

Lambda表达式的Platform.runLater()无法正常工作

[英]Platform.runLater() with Lambda Expression not working

在我的程序中,我经常使用另一个线程对UI进行修改。 更改如下所示:

buffer.add(new Object[]{message.getSecondNode().getUINode(), "red"});

因此,为了不使UI过载,我缓冲了这些修改。 但是在以下方法中,程序不会进行缓冲区中传递的所有更改。

private void changeColor(List<Object[]> buffer) {
    Platform.runLater(() -> {
        for (Object[] object : buffer) {
            if (object[0] instanceof UIEdge) {
                UIEdge edge = (UIEdge) object[0];
                edge.setColor((String) object[1]);
            } else if (object[0] instanceof UINode) {
                if ((String) object[1] == "red")
                    Util.print("");
                UINode node = (UINode) object[0];
                node.getEllipse().setFill(Paint.valueOf((String) object[1]));
            }
        }
    });
}

在下图中,您可以看到缓冲区在方法中的大小与其在程序中的全局大小不同。 有人知道为什么吗?

您可能要考虑使用JavaFX ServiceTask而不是使用缓冲区进行更新。 这些JavaFX类是为了使JavaFX应用程序中的多线程更容易而提供的。

https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html

因为该任务是为与JavaFX GUI应用程序一起使用而设计的,所以它可以确保对其公共属性的每次更改以及状态,错误和事件处理程序的更改通知都在主JavaFX应用程序线程上发生。

https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Service.html

默认情况下,该服务使用具有一些未指定的默认或最大线程池大小的线程池执行程序。 这样做是为了避免天真的代码不会通过创建数千个线程来完全淹没系统。

如果您还不熟悉它们,这是一个简短的教程。 https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM