如何在 mouseDragged 事件中访问 ImageIcons

2024-01-08

我试图弄清楚如何在我的事件中访问使用 PaintComponent 绘制的不同图像(作业中不允许使用 JLabels)。

拖动时,我只希望通过鼠标拖动移动一张图像,并且我似乎无法使用 e.getSource() 访问“当前图像”。

My paintComponent此时将同时移动所有 (3) 个图像。

我的问题是:如何用鼠标拖动来获取单个 ImageIcon?

public class PhotoPanel extends JPanel implements MouseListener, MouseMotionListener {

private java.util.List<ImageIcon> myList = new ArrayList<>();
private int mx, my;

private ImageIcon image1 = new ImageIcon("src/resources/gira.gif");
private ImageIcon image2 = new ImageIcon("src/resources/stru.gif");
private ImageIcon image3 = new ImageIcon("src/resources/back.gif"); 

public PhotoPanel()
{
    setBackground(Color.GREEN);

    myList.add(image1);
    myList.add(image2);
    myList.add(image3);

    //Is this a problematic way of doin it?
    addMouseMotionListener(this);

}

public void paintComponent (Graphics g) {

    super.paintComponent(g);

    for (ImageIcon i : myList)
    {
       g.drawImage(i.getImage(), mx, my, this);
    }    
}


@Override
public void mouseDragged(MouseEvent e) {

    //if(e.getSource == image1)
    //{
    //    Manipulate single picture, but not working this way  
    //}
    mx = e.getX();
    my = e.getY();

    repaint();
    }    
}

我正在尝试弄清楚如何在我的事件中访问使用 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);
}

这是我过去用同样的技术做过的拼图游戏:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 mouseDragged 事件中访问 ImageIcons 的相关文章

随机推荐