如何依次而不是一次更改JavaFx映像?

时间:2018-11-27 21:24:00

标签: java javafx javafx-8 scenebuilder

我正在创建一个程序来一次对许多计算机实验室执行ping操作。在主界面上,根据所有计算机是否可ping通,图像为红色或绿色。当我调用pingAllLabs方法时,它会正确地将它们更改为红色或绿色,但全部都在末尾而不是在每次完成时更改。

This stackOverflow answer非常相似,但我不知道如何实现

这是执行ping操作的代码。在Lab类中,它创建了一个已损坏的PC名称字符串的数组列表。

@FXML
public void pingAllLabs() throws IOException{
    for (int  i = 0;i<list.listOfLabs.size();i++{
       list.listOfLabs.get(i).printBroke(fileName);
       updateImages(list.listOfLabs.get(i),i);
    }
}

这是实际更改图像的代码。它从发送给它的实验室中检索损坏的PC的arrayList,如果列表不为空,则将图像数组列表中的图像更改为红色,或者如果列表为空,则将其更改为绿色。

    @FXML
public void updateImages(Lab lab,int i){

    Image red = new Image("RedComp.png");
    Image green = new Image("GreenComp.png");

    ArrayList<String> list = lab.getBrokenList();

    if (!list.isEmpty()){
        images.get(i).setImage(red);
        System.out.println("Setting "+lab.getName()+" to red");
    }
    else{
        System.out.println("Setting to green");
        images.get(i).setImage(green);

    }

}

1 个答案:

答案 0 :(得分:0)

对于此方法,在此处阻止

public void pingAllLabs() throws IOException{
    for (int  i = 0;i<list.listOfLabs.size();i++{
       list.listOfLabs.get(i).printBroke(fileName);
       updateImages(list.listOfLabs.get(i),i);
    }
}

进行以下更改

public void pingAllLabs() throws IOException{

    new Thread(() -> {
           for (int  i = 0;i<list.listOfLabs.size();i++) {
           list.listOfLabs.get(i).printBroke(fileName);
           updateImages(list.listOfLabs.get(i),i);
           }
       }).start();

    }
}

并更改此块

 if (!list.isEmpty()){
        images.get(i).setImage(red);
        System.out.println("Setting "+lab.getName()+" to red");
    }
    else{
        System.out.println("Setting to green");
        images.get(i).setImage(green);

    }

进行以下更改

 if (!list.isEmpty()){
        Platform.runLater( () -> images.get(i).setImage(red))
        System.out.println("Setting "+lab.getName()+" to red");
    }
    else{
        System.out.println("Setting to green");
         Platform.runLater( () -> images.get(i).setImage(green))

    }

因此,现在您将不会阻塞UI线程,也将允许异步完成更新。

见解

问题类似于您链接的问题,您在JavaFx Application线程上运行for循环,这导致模型更改不会立即呈现,而只会在您从pingAllLab()返回之后才呈现, updateImages()返回包含循环的内容。上面的代码在另一个线程上运行图像添加逻辑,然后使用Platform.runLater()将更新发布到UI事件队列。

因此,每当您编写以某种方式影响UI的代码时,请使用Platform.runLater()