JavaFX:如何强制直接应用新样式 class?

JavaFX: How to enforce that a new style class is applied directly?

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

但是新的样式类好像是算法完成后才渲染出来的。 另一方面,控制台输出在运行时正确显示。

有问题的代码:

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

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