我正在用java程序创建背景图像,然后上传到一个站点来显示数据。这些图像基于创建唯一视图和数据点的参数,我可以将它们上传到服务器。
在该站点上,我添加项目以显示屏幕上特定位置的数据。我之所以这样做,是因为我的java程序可以创建背景和数据点,但我必须手动配置数据点的位置,方法是找到正确的位置,并在执行过程中配置它们。
我希望在我的java程序的父面板中找出特定标签和面板的相同位置,这样我就可以存储这些点,然后使用它们为我的数据点生成位置,以便将来可以自动化。
我的背景结构是这样
框架-容纳一个JTabbedPane,在4-10个不同的面板之间切换.
每个平板面板都是成为背景的主面板。
在每个面板中有多个子面板,这些子面板使用一个GridbagLayout组织。
每个子面板可以有自己的面板或标签,这是我想要记录的位置。
这是一张图片,展示了其中一个面板的例子。红色的盒子是标签的位置,我想得到一个位置。

我试着使用下面的代码查找位置并将它们放在标签上,但是位置总是在0,0。
public void positions(Container p1) {
for (Component p : p1.getComponents()) {
if (p instanceof JLabel) {
try {
if (((JLabel) p).getText().isEmpty()) {
Point spot = ((JLabel) p).getLocation();
((JLabel) p).setText(spot.toString());
}
} catch (NullPointerException e) {
}
//System.out.println(e.getMessage());
} else {
if (p instanceof JPanel) {
positions((Container) p);
}
}
}
}这将调用更新结束时的函数。
mainPanel.revalidate();
mainPanel.repaint();
positions(mainPanel);更新。我从框架类中调用了上述函数,它更新了选项卡窗格上的每个面板,然后打包,然后调用该函数。

如您所见,这些位置是相对的,它是包含标签的面板,而不是包含所有子面板的面板。
发布于 2016-01-26 15:02:59
而不是
if (((JLabel) p).getText().isEmpty()) {
Point spot = ((JLabel) p).getLocation();
((JLabel) p).setText(spot.toString());
}如果您想要相对于主面板的位置,您可能应该这样做:
Point spot = new Point();
Component currComponent = p;
while ( currComponent != null && currComponent != mainPanel ) {
Point relativeLocation = currComponent.getLocation();
spot.translate( relativeLocation.x, relativeLocation.y );
currComponent = currComponent.getParent();
}
((JLabel) p).setText(spot.toString());这基本上将每个JLabel (这是在if中)的坐标添加到其所有父级的坐标中,直到mainPanel。
发布于 2016-01-26 14:53:44
在调用框架上的pack()方法之后,调用您的pack()方法。
发布于 2016-01-26 14:32:31
来自getLocation()文档:
由于本机事件处理的异步特性,此方法可以返回过时的值(例如,在快速连续多次调用setLocation()之后)。因此,建议的获取组件位置的方法在操作系统完成移动组件后调用的setLocation中。
也许试试这个。
https://stackoverflow.com/questions/35015576
复制相似问题