场景:我有一个 JFrame
和 JPanel
添加到那个 JFrame
。在此面板上,我使用以下方法绘制了 3 张图像:
public void paint(graphics g) {
g.drawImage(img1,100,100,null);
g.drawImage(img2,200,200,null);
g.drawImage(img3,300,300,null);
}
我已经实现了 MouseListener
接口(interface)来监听点击。现在,我希望每当我单击这些图像中的任何一个时,我的输出(在命令提示符下使用 System.out.println();
)应该是我单击的图像对象?
请解释一下这是否可能以及如何实现?
最佳答案
好吧,首先你要在 (0,0) 处绘制所有图像,你确定要这样做吗?如果这样做,您可能会单击属于所有图像的点(例如,0,0)。
顺便说一句,在你的 MouseListener 中你有这个方法:
public void mouseClicked(MouseEvent e)
{
Point point = e.getPoint();
}
point 存储您的点击相对于您正在收听的组件的坐标。 所以你要做的只是检查你点击的点是否在图像区域内。您可以执行以下操作:
Rectangle imageBounds = new Rectangle(x,y,image_width, image_height);
if (imageBounds.contains(point)){
//point is inside given image
}
其中 x,y 是您使用 drawImage 方法绘制图像的坐标(在您的情况下为 0,0),image_width、image_height 是图像的尺寸。
编辑:
我上面解释的解决方案还有一个替代方案。正如 Hovercraft Full Of Eels 所建议的那样,您可以执行以下操作:
- 为每个要显示的图像创建一个 JLabel
- 使用 JLabel 的 setIcon()指定将在每个标签上显示的图像的方法。
- 将标签添加到 JPanel
- 为每个 JLabel 添加一个鼠标监听器
这种方法有一个很大的好处:您不必担心鼠标坐标,因为每个 JLabel 都有它的相对鼠标监听器。 您应该考虑的唯一一件事是:
使用 Component 而不是绘制图像,您将无法绝对定位它们,但您必须使用适当的 LayoutManager 来布局 JLabel。
关于Java 查找我单击的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8028915/