我有一个框架,我在其上创建了一个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)
他们都有坐标(0,0)的原因是,当你要求x和y时,他们还没有任何位置。框架显示在方法的底部。
来自getBounds()
的:
边界指定此组件相对于其父
的宽度,高度和位置
当您获得标签的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);
}
}