Java 如何在动态添加的JLabel的JPanel中获取location()?

Java 如何在动态添加的JLabel的JPanel中获取location()?,java,swing,components,location,dynamic,Java,Swing,Components,Location,Dynamic,我已经动态创建了许多jlabel,并使用以下代码将它们添加到JPanel中(我希望代码应该足以理解问题!) 我对所有组件都有相同的位置,而不仅仅是一个组件 另外(更重要的是)我得到了以下代码的位置java.awt.Point[x=0,y=0] System.out.println("Component position [1]: " + textPanel.getComponent(1).getLocationOnScreen()); System.out.println("Position

我已经动态创建了许多jlabel,并使用以下代码将它们添加到JPanel中(我希望代码应该足以理解问题!)

我对所有组件都有相同的位置,而不仅仅是一个组件

另外(更重要的是)我得到了以下代码的位置
java.awt.Point[x=0,y=0]

System.out.println("Component position [1]: " +
textPanel.getComponent(1).getLocationOnScreen());
System.out.println("Position of Component 1: " + map.get(1).getLocation());
我猜这是因为jlabel是动态创建的。但是,我确实需要动态地创建它们,并且还需要能够通过
getLocation()
获取它们的位置


请帮忙!也许有另一种方法来创建它们或以不同的方式访问它们的位置?

当您创建一个组件时,它的默认位置为(0,0)

向配电盘添加零部件不会更改此位置

将所有标签添加到面板后,需要执行以下操作:

panel.revalidate();
这将调用面板使用的布局管理器,然后根据布局管理器的规则为每个标签分配一个适当的位置。

这是一个SSCCE

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class WhereIsMyComponent {

    public static void showComponentLocations(Container parent) {
        Component[] all = parent.getComponents();
        System.out.println("Show locations of children..");
        for (Component c : all) {
            System.out.println(c.getLocation());
        }
    }

    public static void main(String[] args) {
        String msg = "Hello World!";
        final JPanel p = new JPanel(new FlowLayout());
        for (int ii=0; ii<6; ii++) {
            p.add(new JLabel(msg));
        }

        ComponentListener cl = new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent ce) {
                showComponentLocations(p);
            }
        };

        p.addComponentListener(cl);

        JFrame f = new JFrame("Where Is My Component?");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(p);
        f.pack();
        f.setSize(400,300);
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }
}

“我希望代码应该足以理解问题!”An通常足以解释问题。或者至少编译、运行并查看问题。@baphomet13:出于好奇,您想解决什么问题?@Ihballoti:我想显示一行字符串,以便访问每个单词(“标记”)的位置。字符串是我通过
getItemText()
方法得到的。最终,我想在jlabel的顶部绘制组成树。如果有人有更好的方法,请用我的方式射击他们:)。谢谢您可能还需要
revalidate()
父组件,这取决于您的UI设计。@camickr:非常感谢!我完全忘记了
revalidate()
ing@阿列克谢·伊万诺夫:谢谢,
validate()
ing
getContentPane()
终于可以工作了。谢谢你们,你们帮我省了几个小时的工作!“下一次,”安德鲁·汤普森说,“我会记得给你一个SSCCE。承诺:)。谢谢!我将以此为例,在未来创建SSCCE!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class WhereIsMyComponent {

    public static void showComponentLocations(Container parent) {
        Component[] all = parent.getComponents();
        System.out.println("Show locations of children..");
        for (Component c : all) {
            System.out.println(c.getLocation());
        }
    }

    public static void main(String[] args) {
        String msg = "Hello World!";
        final JPanel p = new JPanel(new FlowLayout());
        for (int ii=0; ii<6; ii++) {
            p.add(new JLabel(msg));
        }

        ComponentListener cl = new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent ce) {
                showComponentLocations(p);
            }
        };

        p.addComponentListener(cl);

        JFrame f = new JFrame("Where Is My Component?");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(p);
        f.pack();
        f.setSize(400,300);
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }
}
Show locations of children..
java.awt.Point[x=16,y=5]
java.awt.Point[x=89,y=5]
java.awt.Point[x=162,y=5]
java.awt.Point[x=235,y=5]
java.awt.Point[x=308,y=5]
java.awt.Point[x=162,y=26]
Show locations of children..
java.awt.Point[x=16,y=5]
java.awt.Point[x=89,y=5]
java.awt.Point[x=162,y=5]
java.awt.Point[x=235,y=5]
java.awt.Point[x=308,y=5]
java.awt.Point[x=162,y=26]
Show locations of children..
java.awt.Point[x=26,y=5]
java.awt.Point[x=99,y=5]
java.awt.Point[x=172,y=5]
java.awt.Point[x=26,y=26]
java.awt.Point[x=99,y=26]
java.awt.Point[x=172,y=26]
Press any key to continue . . .