具有Lambda表达式的Platform.runLater()不起作用

时间:2016-09-08 12:19:21

标签: java javafx lambda

在我的程序中,我经常使用另一个线程对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]));
            }
        }
    });
}

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

1 个答案:

答案 0 :(得分:0)

您可能需要考虑使用JavaFX ServiceTask而不是缓冲区来进行更新。这些是JavaFX类,用于在JavaFX应用程序中简化多线程。

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

  

因为Task设计用于JavaFX GUI应用程序,所以它确保对其公共属性的每次更改,以及状态,错误和事件处理程序的更改通知都发生在主JavaFX应用程序线程上。 / p>

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

  

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

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