场景:我向JFrame
添加了一个JPanel
和JFrame
。在这个面板上,我使用了以下三个图像:
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();
的命令提示符下)应该是我点击过的图像对象?
请解释我是否有可能以及如何?
答案 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建议您可以执行以下操作:
这种方法有很大的好处:您不必担心鼠标坐标,因为每个JLabel都有相对的鼠标监听器。 您应该考虑的唯一一件事是:
使用Component而不是绘制图像,你将无法绝对使用它们,但你必须使用适当的LayoutManager来布局你的JLabel。
答案 1 :(得分:0)
这就是我为一个简单的纸牌游戏所做的工作:
在mouseClicked(或监听器中的其他适用方法)上,遍历您的图像集并调用 wasClicked(),这可能如下所示:
public boolean wasClicked( int x, int y ) {
return( x > getX() && x < ( getX() + getWidth() ) &&
y > getY() && y < ( getY() + getHeight() ) );
}
您的实施可能会有所不同。或者你也可以扩展一个JComponent并添加一个MouseListener,但由于我目前无法回想起的原因,在我的情况下,上面对我来说效果更好。