【问题标题】:Java finding which image I clicked?Java找到我点击了哪个图像?
【发布时间】:2011-12-23 03:44:34
【问题描述】:

场景:我有一个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 接口来监听点击。现在,我希望每当我单击这些图像中的任何一个时,我的输出(在命令提示符下使用System.out.println();)应该是我单击的图像对象?

请解释一下这是否可能以及如何实现?

【问题讨论】:

  • 您似乎是在一张一张地绘制图像——对吗?您应该在 JPanel 的paintComponent 中进行所有绘制,而不是绘制。更好的是使用包含 ImageIcons 的 JLabels。
  • @Hovercraft Full Of Eels:你是对的......可能最好的应该是使用 JLabels 并为每个附加鼠标监听器。我让你写这个解决方案:)
  • @Heisenbug:您继续并将其作为选项添加到您的答案中。我有足够的积分。顺便说一下你的答案1+。

标签: java image swing jpanel mouseevent


【解决方案1】:

嗯,首先,您要在 (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 都有它的相对鼠标侦听器。 您应该考虑的唯一一件事是:

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

【讨论】:

  • 那是错字!!在 (0,0) 处绘图
【解决方案2】:

这就是我为一个简单的纸牌游戏所做的:

  1. 可选:制作一个对象来代表您的可点击图像。它应该知道它的 (x, y)、宽度/高度以及如何在屏幕上绘制自己。
  2. 保留对集合中所有可点击图像的引用(例如列表)。
  3. 创建一个方法来确定用户点击的位置是否在您的可点击图像的边界内(我把它放在从 #1 创建的对象中)。
  4. 在 mouseClicked(或侦听器中的其他适用方法)上,遍历您的图像集合并调用 wasClicked(),它可能看起来像这样:

    public boolean wasClicked( int x, int y ) {
    
        return( x > getX() && x < ( getX() + getWidth() ) && 
                y > getY() && y < ( getY() + getHeight() ) );
    
    }
    

您的实施可能会有所不同。或者,您也可以扩展一个 JComponent 并向其中添加一个 MouseListener,但由于我目前不记得的原因,在我的情况下,上述方法对我来说效果更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多