我正试图用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));
}
}
}
1条答案
按热度按时间dgsult0t1#
既然提到了lag,我想这个gridpane中会有很多项。
1-虚拟化列表
仅当图像设置为显示在客户端的视口中时(当它们滚动时),才会渲染图像。这也意味着,如果一个图像以前被渲染过,并且不再需要它,那么如果可能的话,最好从内存中卸载它(但这会增加其他的复杂性)。只有当用户可以在一个轴上滚动(通常是垂直滚动)时,这才有意义。这不是一个琐碎的任务,您应该在尝试自己做这件事之前寻找一个为您做这件事的库。这个古老的答案讨论了javafx中的虚拟化。
2-缩略图
我不认为有提到是否元素将有一个固定的大小,虽然这是典型的网格显示的情况。减少加载时间的一个好方法是将原始图像的副本保存在某个地方,使其具有您计划显示的尺寸,这样您就不必加载大量图像来显著缩小它。这也意味着它不必为每个图像运行调整大小算法来显示它。