gpt4 book ai didi

java - 为什么 getDeepestComponentAt() 返回 null?

转载 作者:行者123 更新时间:2023-12-01 11:57:45 24 4
gpt4 key购买 nike

我想将文本从 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());

为什么会返回 null?如何获取这个 drop 组件 'd'?

最佳答案

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

MouseEvent返回的位置信息也在源组件上下文中(0x0 是源组件的左上角位置)。

这意味着当您使用Component d = SwingUtilities.getDeepestComponentAt(this.pole, me.getX(), me.getY());时,坐标不在 pole 中上下文,但来源Component s,这可能意味着 pole不包含这些坐标并且该方法返回 null .

作为JavaDocs说“如果父级不包含指定的位置,则返回 null”

您可以尝试翻译 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);

但这仍然可以返回 null如果您拖动超出pole的矩形边界...

关于java - 为什么 getDeepestComponentAt() 返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28230134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com