我在另一个复杂的JPanels结构和大量代码的项目中遇到了这个问题。
在那里,我有以下代码片段:
Point point = label.getLocation();
Point point2 = SwingUtilities.convertPoint(label.getParent(), point, panel);
在动态选择标签和面板的情况下,JLabel应该是JPanel的孙子辈。
那么问题就是:在源和目标具有子父关系的情况下,什么情况下SwingUtilities.convertPoint()
会返回负值?这种情况可能吗?
以下代码演示了负坐标问题,但此时panel22不是label的父级元素。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class NegativeLocation {
public static void main(String[] args) {
new NegativeLocation();
}
public NegativeLocation() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel panel1 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
};
JPanel panel21 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 400);
}
};
panel1.add(panel21);
JPanel panel22 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 400);
}
};
panel1.add(panel22);
JPanel panel3 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 400);
}
};
panel21.add(panel3);
JLabel label = new JLabel("Label");
panel3.add(label);
frame.getContentPane().add(panel1);
frame.setPreferredSize(new Dimension(600, 400));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Point point = label.getLocation();
Point point2 = SwingUtilities.convertPoint(label.getParent(), point, panel21);
Point point3 = SwingUtilities.convertPoint(label.getParent(), point, panel22);
System.out.println(point2);
System.out.println(point3);
}
});
}
}
因此,输出结果为:
java.awt.Point[x=134,y=10]
java.awt.Point[x=134,y=-395]
更新:基本上,我需要获取label
相对于panel21
的位置。如何修改这行代码以实现它?
Point point = label.getLocation();
Point point2 = SwingUtilities.convertPoint(label.getParent(), point, panel21);
getLocation()
返回相对于父级的结果。因此,我将父级指定为源。我的逻辑有什么问题吗? - Nikolay KuznetsovPoint point2 = SwingUtilities.convertPoint(label, new Point(0,0), panel21);
是这样的吗? - Nikolay Kuznetsov