首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找子组件相对于其父面板的位置

查找子组件相对于其父面板的位置
EN

Stack Overflow用户
提问于 2016-01-26 14:00:36
回答 5查看 1.8K关注 0票数 2

我正在用java程序创建背景图像,然后上传到一个站点来显示数据。这些图像基于创建唯一视图和数据点的参数,我可以将它们上传到服务器。

在该站点上,我添加项目以显示屏幕上特定位置的数据。我之所以这样做,是因为我的java程序可以创建背景和数据点,但我必须手动配置数据点的位置,方法是找到正确的位置,并在执行过程中配置它们。

我希望在我的java程序的父面板中找出特定标签和面板的相同位置,这样我就可以存储这些点,然后使用它们为我的数据点生成位置,以便将来可以自动化。

我的背景结构是这样

框架-容纳一个JTabbedPane,在4-10个不同的面板之间切换.

每个平板面板都是成为背景的主面板。

在每个面板中有多个子面板,这些子面板使用一个GridbagLayout组织。

每个子面板可以有自己的面板或标签,这是我想要记录的位置。

这是一张图片,展示了其中一个面板的例子。红色的盒子是标签的位置,我想得到一个位置。

我试着使用下面的代码查找位置并将它们放在标签上,但是位置总是在0,0。

代码语言:javascript
复制
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);
            }
        }
    }

}

这将调用更新结束时的函数。

代码语言:javascript
复制
mainPanel.revalidate();
mainPanel.repaint();
positions(mainPanel);

更新。我从框架类中调用了上述函数,它更新了选项卡窗格上的每个面板,然后打包,然后调用该函数。

如您所见,这些位置是相对的,它是包含标签的面板,而不是包含所有子面板的面板。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-01-26 15:02:59

而不是

代码语言:javascript
复制
if (((JLabel) p).getText().isEmpty()) {
    Point spot = ((JLabel) p).getLocation();
    ((JLabel) p).setText(spot.toString());
}

如果您想要相对于主面板的位置,您可能应该这样做:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2016-01-26 14:53:44

在调用框架上的pack()方法之后,调用您的pack()方法。

票数 2
EN

Stack Overflow用户

发布于 2016-01-26 14:32:31

来自getLocation()文档:

由于本机事件处理的异步特性,此方法可以返回过时的值(例如,在快速连续多次调用setLocation()之后)。因此,建议的获取组件位置的方法在操作系统完成移动组件后调用的setLocation中。

也许试试这个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35015576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档