java - 如何按顺序而不是一次更改 JavaFx 图像?
问题描述
我正在创建一个程序来一次 ping 多个计算机实验室。在主 UI 上,根据所有计算机是否都可以 ping 通,有红色或绿色的图像。当我调用 pingAllLabs 方法时,它会正确地将它们更改为红色或绿色,但在最后而不是在每个都完成时立即全部更改。
这个 stackOverflow 答案非常相似,但我不能/不知道如何实现它
这是执行 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 的数组列表,如果列表不为空,它将图像数组列表中的图像更改为红色,或者如果列表为空,则将其更改为绿色。
@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);
}
}
解决方案
对于此方法,请在此处阻止
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()
返回后才返回。updateImages()
上面的代码在不同的线程上运行图像添加逻辑,然后使用Platform.runLater()
.
因此,每当您编写以某种方式影响 UI 的代码时,请使用Platform.runLater()
推荐阅读
- koa - 如何在 Koa 中提供具有正确文件名和扩展名的文件?
- reactjs - TypeScript 是的 | 预期 0 个参数,但得到 1.ts(2554)
- css - HowTo:将输入到输入框中的第一个单词的首字母大写
- pandas - 如何过滤掉数据框中的行并求和
- php - 无法确定在 mailjet API 调用中将模板 ID 放在何处
- axapta - 修改方法
- r - 我写了一个函数来删除替换 % 登录 r 代码
- python-3.x - jinja2.exceptions.TemplateNotFound:模板/entry.html
- sql - 图表类中的 SQL 数据库架构
- javascript - 重试时客户端连接未正确关闭