如何让我的顶级Jpanel设置相对于另一个jpanel网格中的jlabel的位置?

时间:2012-10-13 00:32:54

标签: java swing jpanel jlabel

方案:我的用户界面包含JPanel(称之为topGrid),网格布局位于顶层JFrame。在topGrid内,我添加了另一个JPanelmidGrid)网格布局。在midGrid内,是另一个JPanelbottomGrid),其中JLabel我根据数组填充图像以及它们的实例在该数组中的内容。

目标:我希望topGrid将其视图集中在bottomGrid中找到的特定对象上。 (想象一下当玩家图标移动时,游戏的网格移动到该图标的中心,并且当游戏开始时,它已经为用户居中。)

我考虑从bottomGrid获取Point并尝试将其传递给topGrid,但似乎没有提取正确的信息。我知道找到玩家所在的唯一方法是遍历所有组件并检查实例。这必须为topGrid做一次,而midGrid再次在bottomGrid找到玩家。然后传递Point数据。然后在适当的JPanel上使用setLocation()减去与中心的距离。

有没有其他人尝试过这种方式,并且有更有效或更优雅的方式来实现它?我可以探索哪些其他选择?

感谢您的反馈。

topGrid的{​​{1}}:

中创建网格
JPanel

public void createTopGrid() { int rows = galaxy.getNumRows(); int columns = galaxy.getNumColumns(); pnlGrid.removeAll(); pnlGrid.setLayout(new GridLayout(rows, columns)); for (int row = 0; row < rows; row++) { for (int col = 0; col < columns; col++) { Position pos = new Position(galaxy, row, col); Sector sector = galaxy.getSector(pos); GalaxySector sectorUI = new GalaxySector(sector); pnlGrid.add(sectorUI); } } } 的{​​{1}}:

中创建网格
midGrid

JPanel中每位乘客的图片图标均来自public void createOccupantIcons() { pnlGridOccupants.removeAll(); Occupant[] occs = sector.getOccupantsAsArray(); for ( Occupant occ : occs ) { GalaxyOccupant occupant = new GalaxyOccupant(occ, sector); pnlGridOccupants.add(occupant); } } 班级midGrid模型中的IconRep String,并已加入根据{{​​1}}的需要bottomGrid

视觉参考:

image

绿色方块为JPanel JLabel,红色方块为FlowLayout topGrid,黑色方块为JPanel midGrid JPanel内的玩家图像的白色圆圈。蓝色圆圈表示用户将看到游戏的视口,是我希望玩家图标居中的位置。目前,用户可以使用视口周围区域中非常不优雅的按钮来移动网格。这可能就足够了,但在游戏开始时,玩家必须移动网格,直到他们找到他们的图标。

2 个答案:

答案 0 :(得分:3)

您还可以查看JScrollNavigator,检查here。它允许您在整个世界的缩略图上导航,在相邻的滚动窗格中以全尺寸显示。

image

答案 1 :(得分:1)

在我的脑海中,我会将你想要的所有参考文献存储在某种模型中。

您可以使用此模型根据选择要求更新视图。

这允许您集中逻辑来查找和更新元素,而无需了解或关注其他UI元素