如何在 java 中获取组件的原点坐标

How to get Coordinate of origin of a component in java

我有一个框架,我在上面创建了一个 12*16 的网格架构(在面板上放置标签),并在每个网格单元格中放置了一个图像。当我尝试使用 getBounds()getX() 以及 getY() 方法获取每个标签的原点坐标时。它正在显示 (0,0)

我不明白为什么所有标签都显示 (0,0)。有什么方法可以访问组件的原点坐标。 这是我的一段代码。

public static void main(String[] arg){


    Toolkit tk = Toolkit.getDefaultToolkit();
    int  xsize = (int)tk.getScreenSize().getWidth();
    int ysize =(int) tk.getScreenSize().getHeight();
    String str,str1;
    Border border = LineBorder.createGrayLineBorder();
    BufferedReader bout;
    BufferedImage image= null;
    JPanel[] panel;
    panel = new JPanel[16];
    button = new JLabel[16];
    JFrame frame = new JFrame("Image Display");
    GridLayout g = new GridLayout();
    FileInputStream file;
    ResizeFunction a = new ResizeFunction();
    try {
          file = new FileInputStream("D:\cache1\newtask_list.txt");
          bout = new BufferedReader(new InputStreamReader(file));
          str = bout.readLine();

    for(int j=0;j<16;j++){
       panel[j] = new JPanel(); 
       panel[j].setLayout(g);
       g.setColumns(1);
       g.setRows(12);
         for(int i=0;i<12;i++){   
             button[i] = new JLabel();
             button[i].setSize(xsize/16, ysize/12);
             int x=(int) button[i].getBounds().getX();
             int y=(int) button[i].getBounds().getY();
             System.out.println("button["+i+"]["+j+"]="+x+","+y);
             button[i].setIgnoreRepaint(true);
             str= bout.readLine();
             str1 = str.substring(0,23);
             image = ImageIO.read(new File("D:\cache1\newtask\"+str1));

             BufferedImage b = a.resizeImage(image,image.getWidth(),image.getHeight(),button[i].getWidth(),button[i].getHeight());
             ImageIcon  icon = new ImageIcon(b);
             button[i].setIcon(icon);
             button[i].setBorder(border);

             panel[j].add(button[i]);   
        }
         frame.add(panel[j]);
       }
   } catch (Exception ex) {
        Logger.getLogger(ButtonGrid.class.getName()).log(Level.SEVERE, null, ex);
        }

    frame.setLayout(new GridLayout());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setSize(xsize, ysize);
    frame.setVisible(false);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setUndecorated(true);
    MouseCursorXYLabel xy = new MouseCursorXYLabel();
    xy.displayJFrame(frame);

    ButtonGrid panel1 = new ButtonGrid();
}

之所以它们的坐标都是(0,0),是因为当你要求x和y时,它们还没有任何位置。该框架显示在您的方法的底部。

来自 getBounds():

The bounds specify this component's width, height, and location relative to its parent

当您获得标签的 x 和 y 坐标时,标签没有父级,父级面板也没有添加到框架中,框架也不可见(它没有任何尺寸)。

此外,在您的第二个循环中,您创建了新的 JLabel 实例(总共 192 个),但您将它们全部放在一个大小为 16 的数组中。因此,您将覆盖每个 JPanel 数组中的引用。

您可以做的 是将所有新的 JLabel 放入一个二维数组中:

JLabel[][] buttons = new JLabel[16][12]

显示框架后,执行如下操作:

for(int i=0;i<16;i++){
   for(int j=0;j<12;j++){
        System.out.println("button[" + i + "][" + j + "]=" + buttons[i][j].getBounds().x + "," + buttons[i][j].getBounds().x);
   }
}