Java找到我点击的图像?

时间:2011-11-06 17:33:16

标签: java image swing jpanel mouseevent

场景:我向JFrame添加了一个JPanelJFrame。在这个面板上,我使用了以下三个图像:

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();的命令提示符下)应该是我点击过的图像对象?

请解释我是否有可能以及如何?

2 个答案:

答案 0 :(得分:7)

嗯,首先你要在(0,0)绘制所有图像,你确定要这样做吗?如果这样做,则可以单击属于所有图像的点(es,0,0)。

顺便说一句,在MouseListener中你有这个方法:

public void mouseClicked(MouseEvent e)
{
    Point point = e.getPoint();
}

指向点击相对于您正在收听的组件的坐标。 所以你要做的只是检查你点击的点是否在图像区域内。您可以执行以下操作:

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
  5. 添加一个鼠标侦听器

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

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

答案 1 :(得分:0)

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

  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() ) );
    
    }
    
  5. 您的实施可能会有所不同。或者你也可以扩展一个JComponent并添加一个MouseListener,但由于我目前无法回想起的原因,在我的情况下,上面对我来说效果更好。