How do I detect the collison of components?

2019-09-06 03:46发布

How do I detect the collision of components, specifically JLabels (or ImageIcons?)? I have tried this:

add(test1);
test1.setLocation(x, y);
add(test2);
test1.setLocation(x1, y1);
validate();

if(intersects(test1, test2))
{
    ehealth-=50;
}

public boolean intersects(JLabel testa, JLabel testb)
{
    boolean b3 = false;
    if(testa.contains(testb.getX(), testb.getY()))
    {
        b3 = true;
    }
    return b3;
}

When I run this, it does nothing!

I used to use Rectangle, but it didn't go well with me. I was thinking about an image with a border (using paint.net) and moving an imageicon, but I don't know how to get the x of an ImageIcon or detect collision. I don't know how to detect collision of a label or increase the location either.

I have searched for collision detection with components/ImageIcons, but nothing has came up. I have also searched for getting the x of ImageIcons.

2条回答
萌系小妹纸
2楼-- · 2019-09-06 04:31

You can write it by yourself, just remember, that two areas intersects if their areas overlay, not just when one contains the x and y coordinates (for which you are testing).

If I were you, I would use Area. It already has contains and intersects methods you need.

查看更多
何必那么认真
3楼-- · 2019-09-06 04:38

Try using computeIntersection() method from SwingUtilities. According to the Javadoc for this method:

Convenience to calculate the intersection of two rectangles without allocating a new rectangle. If the two rectangles don't intersect, then the returned rectangle begins at (0,0) and has zero width and height.

Here's something that you can do with the above:

public boolean intersects(JLabel testa, JLabel testb){
    Rectangle rectB = testb.getBounds();

    Rectangle result = SwingUtilities.computeIntersection(testa.getX(), testa.getY(), testa.getWidth(), testa.getHeight(), rectB);

    return (result.getWidth() > 0 && result.getHeight() > 0);
}

Another way, as @Jakub suggested was to use intersects() method of Area. Sample code for that would be something like this:

public boolean intersects(JLabel testa, JLabel testb){
    Area areaA = new Area(testa.getBounds());
    Area areaB = new Area(testb.getBounds());

    return areaA.intersects(areaB.getBounds2D());
}
查看更多
登录 后发表回答