【问题标题】:How can I change JavaFx images sequentially rather than all at once?如何按顺序而不是一次更改 JavaFx 图像?
【发布时间】:2019-04-29 16:57:34
【问题描述】:

我正在创建一个程序来同时 ping 多个计算机实验室。在主 UI 上,根据所有计算机是否都可以 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);
    }
}

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

    @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);

    }

}

【问题讨论】:

  • 目前还不清楚发生了什么。我是否可以说有多个实验室,每个实验室都有多台计算机,并且每台计算机(具有可 ping 状态)都由 GUI 上的图像表示?如果是这样,那么现在 GUI 会立即更新 single 实验室中的所有计算机,还是更新 所有 实验室中的所有计算机?

标签: java javafx javafx-8 scenebuilder


【解决方案1】:

这个方法在这里阻塞

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 应用程序线程上运行 for 循环,这会导致模型更改不会立即呈现,而是仅在您从 pingAllLab() 返回后才呈现,@987654326 后才返回@ 返回包含循环的内容。上面的代码在不同的线程上运行图像添加逻辑,然后使用Platform.runLater() 将更新发布到 UI 事件队列。

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

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 2015-10-08
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多