【问题标题】:JavaFX: How to enforce that a new style class is applied directly?JavaFX:如何强制直接应用新的样式类?
【发布时间】:2016-03-22 11:43:36
【问题描述】:

我正在构建一个应用程序,它在图表上显示不同寻路算法的结果。因此,每次扩展节点时,我都希望将其突出显示。出于这个原因,我有一个侦听器,每次扩展节点时都会执行该侦听器。此外,还有可能延迟该过程。

但新样式类似乎仅在算法完成后才呈现。 另一方面,控制台输出在运行时正确显示。

有问题的代码:

IDiGraphSearchListener<XYNode, CostEdge<XYNode>> listener = new IDiGraphSearchListener<XYNode, CostEdge<XYNode>>() {
    List<CostEdge<XYNode>> way;
    @Override
    public void onExpandNode(XYNode node, List<CostEdge<XYNode>> way) {
        if (this.way == null) {
            this.way = way;
        }
        System.out.println("Expanding");
        for (CostEdge<XYNode> costEdge : way) {
                graphPane.lookup("#"+costEdge.getId()).getStyleClass().add("visited");
                graphPane.lookup("#"+costEdge.getSource().getId()).getStyleClass().add("visited");
                graphPane.lookup("#"+costEdge.getTarget().getId()).getStyleClass().add("visited");
                System.out.println("Coloring-> EdgeID:"+costEdge.getId()+" From:"+costEdge.getSource().getId()+" To:"+costEdge.getTarget().getId());
        }       
        try {
            System.out.println("Sleeping");
            Thread.sleep((long) (pathfindingSpeedSlider.getValue()*1000));
        } catch (InterruptedException ex) {
            //ToCatchOrNot
        }
    }
};

样本输出:

Algo: AStar
Expanding
Expanding
Coloring-> EdgeID:id20 From:id1 To:id2
Coloring-> EdgeID:id25 From:id1 To:id4
Coloring-> EdgeID:id45 From:id1 To:id9
Expanding
Coloring-> EdgeID:id21 From:id2 To:id3
Coloring-> EdgeID:id20 From:id1 To:id2
Coloring-> EdgeID:id25 From:id1 To:id4
Coloring-> EdgeID:id45 From:id1 To:id9
Expanding
Coloring-> EdgeID:id21 From:id2 To:id3
Coloring-> EdgeID:id20 From:id1 To:id2
Coloring-> EdgeID:id25 From:id1 To:id4
Coloring-> EdgeID:id45 From:id1 To:id9
Expanding
Coloring-> EdgeID:id21 From:id2 To:id3
Coloring-> EdgeID:id20 From:id1 To:id2
Coloring-> EdgeID:id46 From:id9 To:id5
Coloring-> EdgeID:id25 From:id1 To:id4
Coloring-> EdgeID:id45 From:id1 To:id9
Expanding
Coloring-> EdgeID:id21 From:id2 To:id3
Coloring-> EdgeID:id20 From:id1 To:id2
Coloring-> EdgeID:id46 From:id9 To:id5
Coloring-> EdgeID:id25 From:id1 To:id4
Coloring-> EdgeID:id28 From:id5 To:id6
Coloring-> EdgeID:id45 From:id1 To:id9
Expanding
Coloring-> EdgeID:id21 From:id2 To:id3
Coloring-> EdgeID:id20 From:id1 To:id2
Coloring-> EdgeID:id46 From:id9 To:id5
Coloring-> EdgeID:id25 From:id1 To:id4
Coloring-> EdgeID:id30 From:id6 To:id7
Coloring-> EdgeID:id28 From:id5 To:id6
Coloring-> EdgeID:id35 From:id6 To:id11
Coloring-> EdgeID:id45 From:id1 To:id9
getWay1
->id1/id9->id9/id5->id5/id6->id6/id7getWay2
Finish

【问题讨论】:

    标签: java javafx javafx-2 listener javafx-8


    【解决方案1】:

    你观察到的行为是很正常的。您正在设置新样式,但它们不会在下一个脉冲之前执行。但是因为你用你的代码阻塞了应用程序线程,所以下一个脉冲将被延迟,直到你完成。

    【讨论】:

    • 如何防止脉搏延迟?
    • 这很难说,因为我不明白你真正想要实现什么行为。简单的答案就是在另一个线程上进行所有处理。
    • 我想可视化算法是如何在图表中前进的。因此,在每次扩展节点后,路径都会突出显示,并且应该有一个延迟,直到下一个节点被扩展。我添加了一些示例控制台输出。
    • 好的,所以您绝对应该看看 JavaFX 并发教程。 docs.oracle.com/javase/8/javafx/interoperability-tutorial/… 正如我之前所说,您必须将算法的计算放在单独的线程上,并对样式进行中间更新。这些更新调用必须包含在 Platform.runLater 调用中,否则您必须使用更高级的 JavaFX 并发技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2023-04-02
    相关资源
    最近更新 更多