Java 查找我单击的图像?

标签 java image swing jpanel mouseevent

场景:我有一个 JFrameJPanel 添加到那个 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 所建议的那样,您可以执行以下操作:

  1. 为每个要显示的图像创建一个 JLabel
  2. 使用 JLabel 的 setIcon()指定将在每个标签上显示的图像的方法。
  3. 将标签添加到 JPanel
  4. 为每个 JLabel 添加一个鼠标监听器

这种方法有一个很大的好处:您不必担心鼠标坐标,因为每个 JLabel 都有它的相对鼠标监听器。 您应该考虑的唯一一件事是:

使用 Component 而不是绘制图像,您将无法绝对定位它们,但您必须使用适当的 LayoutManager 来布局 JLabel。

关于Java 查找我单击的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8028915/

相关文章:

java - 将鼠标指针保持在框架/窗口内

java - 读取同时包含 string 和 double 的文件来绘制矩形

java - 不分割获取url参数

java - 为什么抑制功能不适用于跳跃窗口?

java - 为什么JLS声明最大的int字面量是2147483648?

java - 根据 JLS(6.4.2。模糊)的 "obscuring"的代码示例,尤其是这个 "local variable or type can obscure a package"

python - 如何在Python和Opencv中检测八边形

android - java.lang.OutOfMemoryError on line httpPost.setEntity(new UrlEncodedFormEntity(params)) 在 android 中以字符串格式发送图像时

c++ - 如何在 UnrealEngine 中对非 2 的幂纹理进行下采样?

java - 如何使用 GridLayout 将 JPanel 数组添加到 JPanel?