我用的是Jave Swing,简化的层次结构可以理解为JFrame -> JPanel -> JLabel。
现在我可以选择将 JLabel 添加到 JPanel 中:
- 面板。添加(标签);
- panel.setLayout(new BorderLayout()); panel.add(label, BorderLayout.NORTH);
这是我在两种情况下都在做的常见配置
panel.setOpaque(false);
panel.setBorder(BorderFactory.createLineBorder(Color.yellow));
即使我保持所有其他代码不变,以下方法调用也会给出非常不同的结果:
Point location = getLocationOnFrame(label);
我调用这个方法来识别 JLabel 相对于 JFrame 的位置:
public Point getLocationOnFrame (JLabel label) {
if (label == null) return null;
try {
Point location = label.getLocationOnScreen();
System.out.println(location);
Point frameOffset = mainFrame.getLocationOnScreen();
System.out.println(frameOffset);
location.translate(-frameOffset.x, -frameOffset.y);
return location;
} catch (IllegalComponentStateException e) {}
return null;
}
这些是 System.out.println() 的结果,即使标签出现在同一个地方。
java.awt.Point[x=578,y=305]
java.awt.Point[x=0,y=0]
java.awt.Point[x=224,y=300]
java.awt.Point[x=0,y=0]
在我看来,在第二种情况下,数字来自父 JPanel 的左上角,而不是 JLabel 本身。
基本上我正在尝试使用第二种情况的代码并从第一种情况下获取数字。