为什么 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'?

MouseEvents 与创建它们的组件相关。这意味着当您释放鼠标按钮时,事件源实际上是您单击的同一组件。

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...