【发布时间】:2020-06-06 16:08:11
【问题描述】:
我一直在做一个项目,该项目显示 16 x 16 的图像网格,根据用户交互,该网格在动态更大的基础上跟随用户(例如,50 x 50 的基础)比16 x 16 显示屏。
但是,我使用JLabel 组件来显示这些图像,并且每次用户交互时,我都必须移动 256 个图像中的每一个,并删除那些不再在 16 x 16 显示网格中的图像。这导致每次按键时的延迟接近一秒,并且接近于无法正常工作。
我希望尝试做的是在地面的总宽度中将这些图像链接在一起,并将焦点移动到 16 x 16 网格内的部分,从而使该过程不再需要使用嵌套用于显示的 for 循环。
我是否可以动态存储和创建这些链接图像以使用标签显示?是否有其他方法可以在 Java 中显示 .png 文件,并且可以以类似的方式存储和使用?
我当前在每次用户交互时都必须绘制每张图像的方法示例:
User user = game.user;
int floorWidth = game.floorWidth;
int floorHeight = game.floorHeight;
int pX = user.getTile().getX();
int pY = user.getTile().getY();
int minX = Math.max(pX - GameConstants.USER_DRAW_DISTANCE, 0);
int maxX = Math.min(floorWidth, pX + GameConstants.USER_DRAW_DISTANCE);
int minY = Math.max(pY - GameConstants.USER_DRAW_DISTANCE, 0);
int maxY = Math.min(floorHeight, pY + GameConstants.USER_DRAW_DISTANCE);
for (int i = minY; i < maxY; i++)
{
for (int x = minX; x < maxX; x++)
{
Tile tile = floor.getTile(x, i);
if (tile.getHasSeen())
{
JLabel cLabel = tile.imageLabel;
cLabel.setLocation(340 + x * 32, 140 + i * 32);
cLabel.setSize(64, 64);
cLabel.setVisible(true);
panel.add(cLabel, 1);
}
}
}
【问题讨论】:
-
避免创建和添加新的 JLabels,而只需更改当前 JLabels 中的图像图标。如果您经常读取图像文件,请避免这样做,如果可能,将图像读入图像图标一次并保存。如需更多帮助,请考虑创建并发布一个minimal reproducible example 计划并提出您的问题。
-
我觉得
JScrollPane在这里很合适。创建一个大的JPanel并将您所有的JLabels 放在上面。然后将JPanel设为JScrollPane的可滚动客户端,并将JScrollPane的首选大小设置为足够大以显示您的16x16 网格。 -
除了使用 JScrollPane 进行滚动外,您还可以使用带有
GridLayout的 JPanel,您可以将网格配置为在 16 个图像处自动换行。阅读 How to Use GridLayout 上的 Swing 教程。不要尝试设置组件的大小/位置。布局管理器的工作是设置大小/位置。另一种选择是使用 JList 并将 ImageIcons 添加到列表中。该列表也可以配置为换行。该教程还有一个关于How to Use Lists的部分。 -
另一种方法是将您的图像用作图块。这是一个例子。 stackoverflow.com/questions/30004538/…
标签: java image swing nested-loops jlabel