我正在尝试弄清楚如何在我的事件中访问使用 PaintComponent 绘制的不同图像(作业中不允许使用 JLabels)
因为您不能使用 JLabels 并且如果您想获取当前选择的图像。您必须遍历图像列表并检查选择了哪一张。
目前,您保留了一个 ImageIcon 列表,并且没有直接的方法来获取 ImageIcon 的边界来检查选择。
如果我是你,我会给当前的ImageIcon添加一个属性(bounds),方便我们检查图像是否被鼠标点击:
class MyImages extends Rectangle
{
private ImageIcon image; //personally, I prefer to use BufferedImage here
public MyImages(int x, int y, int width, int height){
setBounds(x, y, width, height);
}
//getters & setters for image not shown
public void draw(Graphics g){
g.drawImage(image.getImage(), x, y, width, height, null);
}
//Check if current image is selected:
public boolean isSelected(int xCoord, int yCoord){
return (this.contains(xCoord, yCoord))
}
}
在您的 PhotoPanel 类中:
//Crate a list of MyImage instead of ImageIcon
ArrayList<MyImage> myList = new ArrayList<MyImage>();
MyImage selectedImage;
在 MouseMotionListener 类中:
@Override
public void mousePressed(MouseEvent e){
//To get the image which is selected:
for(MyImage img : myList)
if(img.isSelected(e.getX(), e.getY())){ //if mouse clicks on this image
selectedImage = img;
break;
}
}
@Override
public void mouseDragged(MouseEvent e){
if(selectedImage != null){
selectedImage .setLocation(e.getX()-(pieceWH/2), e.getY()-(pieceWH/2));
repaint();
}
}
我维护一个实例调用selectedImage
,并在鼠标拖动时,我们将更改selectedImage
仅有的。因此,只有最后选择的图像才会移动。
In your paintComponent(g)
方法,你可以使用.draw(g)
如果您创建了一个自定义的 Image 类,例如MyImage
:
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
for (MyImage i : myList)
i.draw(g);
}
这是我过去用同样的技术做过的拼图游戏: