为什么 getDeepestComponentAt() return 为空?
Why getDeepestComponentAt() return null?
我想将文本从 jlabel 拖到 jtextfield(我有 9 个 jlabel 和 81 个 jtextfield)。
代码如下:
JPanel pole = new JPanel();
pole.add(tf[0][0]);
tf[0][0].addMouseListener(this);
tf[0][0].setName("0,0");
......
......
pole.add(jlab1);
jlab1.addMouseListener(this);
jlab1.setName("1");
.....
.....
@Override
public void mouseReleased(MouseEvent me) {
//get drag component (that's ok)
Component c = me.getComponent();
//get drop component - doesn't work - return null :(
Component d = SwingUtilities.getDeepestComponentAt(this.pole, me.getX(), me.getY());
为什么这个 return 为空?这个drop组件如何获取'd'?
MouseEvent
s 与创建它们的组件相关。这意味着当您释放鼠标按钮时,事件源实际上是您单击的同一组件。
由 MouseEvent
编辑的位置信息 return 也在源组件上下文中(0x0 是源组件的左上角位置)。
这意味着当您使用 Component d = SwingUtilities.getDeepestComponentAt(this.pole, me.getX(), me.getY());
时,坐标不在 pole
上下文中,而是在源 Component
中,这可能意味着 pole
不包含那些坐标和方法 return 的 null
.
正如 JavaDocs 所说 "If parent does not contain the specified location, then null is returned"
您可以尝试将 MouseEvent
位置翻译成 pole
的上下文,使用类似...
MouseEvent evt = SwingUtilities.convertMouseEvent(e.getComponent(), e, textField);
或
Point p = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), textField);
但仍不能保证该点位于组件范围内。
您可以进一步测试该点相对于 pole
的位置,使用更像...
Rectangle bounds = textField.getBounds();
bounds.setLocation(0, 0);
if (bounds.contains(p)) {
// Finally...
}
或者可能...
Point p = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), pole);
Component dropPoint = SwingUtilities.getDeepestComponentAt(pole, p.x, p.y);
但是,如果您拖动超出 pole
的矩形边界,这仍然可以 return null
...
我想将文本从 jlabel 拖到 jtextfield(我有 9 个 jlabel 和 81 个 jtextfield)。
代码如下:
JPanel pole = new JPanel();
pole.add(tf[0][0]);
tf[0][0].addMouseListener(this);
tf[0][0].setName("0,0");
......
......
pole.add(jlab1);
jlab1.addMouseListener(this);
jlab1.setName("1");
.....
.....
@Override
public void mouseReleased(MouseEvent me) {
//get drag component (that's ok)
Component c = me.getComponent();
//get drop component - doesn't work - return null :(
Component d = SwingUtilities.getDeepestComponentAt(this.pole, me.getX(), me.getY());
为什么这个 return 为空?这个drop组件如何获取'd'?
MouseEvent
s 与创建它们的组件相关。这意味着当您释放鼠标按钮时,事件源实际上是您单击的同一组件。
由 MouseEvent
编辑的位置信息 return 也在源组件上下文中(0x0 是源组件的左上角位置)。
这意味着当您使用 Component d = SwingUtilities.getDeepestComponentAt(this.pole, me.getX(), me.getY());
时,坐标不在 pole
上下文中,而是在源 Component
中,这可能意味着 pole
不包含那些坐标和方法 return 的 null
.
正如 JavaDocs 所说 "If parent does not contain the specified location, then null is returned"
您可以尝试将 MouseEvent
位置翻译成 pole
的上下文,使用类似...
MouseEvent evt = SwingUtilities.convertMouseEvent(e.getComponent(), e, textField);
或
Point p = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), textField);
但仍不能保证该点位于组件范围内。
您可以进一步测试该点相对于 pole
的位置,使用更像...
Rectangle bounds = textField.getBounds();
bounds.setLocation(0, 0);
if (bounds.contains(p)) {
// Finally...
}
或者可能...
Point p = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), pole);
Component dropPoint = SwingUtilities.getDeepestComponentAt(pole, p.x, p.y);
但是,如果您拖动超出 pole
的矩形边界,这仍然可以 return null
...