在JavaFXGridPane中显示多个图像时出现延迟

hmtdttj4  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(291)

我正试图用javafx在gridpane中使用约束显示一组图像,我的代码确实完美地显示了它们。然而,由于某些原因,这些图像导致我的阶段延迟,尽管我的代码在工作。有什么办法可以让我摆脱这一切吗?
对于context,“arr”是一个2darrayList,我将其设置为包含字符串,checkboxlist包含一些复选框,这些复选框按约40列排列,每列之间的间距为2。

public void setUpTypeImages()
{
  for (int p = 0; p < arr.size(); p++)
  {
     typesList.add(new ArrayList<ImageView>());
     for (int y = 0; y < arr.get(p).size(); y++)
     {  
        ImageView type = new ImageView("Types\\" + arr.get(p).get(y) + ".png");
        typesList.get(p).add(type);
        typesList.get(p).get(y).setFitWidth(30);
        typesList.get(p).get(y).setFitHeight(30);     
        GridPane.setConstraints(typesList.get(p).get(y), GridPane.getColumnIndex(checkBoxList.get(p)) + y + 1, GridPane.getRowIndex(checkBoxList.get(p))); 
        choiceLayout.getChildren().add(typesList.get(p).get(y));
     }
  }
}
dgsult0t

dgsult0t1#

既然提到了lag,我想这个gridpane中会有很多项。

1-虚拟化列表

仅当图像设置为显示在客户端的视口中时(当它们滚动时),才会渲染图像。这也意味着,如果一个图像以前被渲染过,并且不再需要它,那么如果可能的话,最好从内存中卸载它(但这会增加其他的复杂性)。只有当用户可以在一个轴上滚动(通常是垂直滚动)时,这才有意义。这不是一个琐碎的任务,您应该在尝试自己做这件事之前寻找一个为您做这件事的库。这个古老的答案讨论了javafx中的虚拟化。

2-缩略图

我不认为有提到是否元素将有一个固定的大小,虽然这是典型的网格显示的情况。减少加载时间的一个好方法是将原始图像的副本保存在某个地方,使其具有您计划显示的尺寸,这样您就不必加载大量图像来显著缩小它。这也意味着它不必为每个图像运行调整大小算法来显示它。

相关问题