问题
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.
回答1:
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());
}
回答2:
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.
来源:https://stackoverflow.com/questions/12325553/how-do-i-detect-the-collison-of-components