Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在我的鼠标标记事件中访问图像图标_Java_Swing_Mouseevent - Fatal编程技术网

Java 如何在我的鼠标标记事件中访问图像图标

Java 如何在我的鼠标标记事件中访问图像图标,java,swing,mouseevent,Java,Swing,Mouseevent,我试图弄清楚如何在我的事件中访问使用paintComponent绘制的不同图像(作业中不允许使用JLabels) 拖动时,我只希望用鼠标拖动一个图像,而且我似乎无法使用e.getSource()访问“当前图像” 我的paintComponent将同时移动所有(3)个图像 我的问题是:如何用我的鼠标标签抓住一个图像图标 public class PhotoPanel extends JPanel implements MouseListener, MouseMotionListener { pr

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

拖动时,我只希望用鼠标拖动一个图像,而且我似乎无法使用e.getSource()访问“当前图像”

我的
paintComponent
将同时移动所有(3)个图像

我的问题是:如何用我的鼠标标签抓住一个图像图标

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();
    }    
}
公共类PhotoPanel扩展JPanel实现MouseListener、MouseMotionListener{
private java.util.List myList=new ArrayList();
私人int mx,我的;
private ImageIcon image1=新的ImageIcon(“src/resources/gira.gif”);
private ImageIcon image2=新的ImageIcon(“src/resources/stru.gif”);
private ImageIcon image3=新的ImageIcon(“src/resources/back.gif”);
公共摄影小组()
{
挫折背景(颜色:绿色);
myList.add(图1);
myList.add(图2);
myList.add(图3);
//这样做有问题吗?
addMouseMotionListener(此);
}
公共组件(图形g){
超级组件(g);
用于(图像图标i:myList)
{
g、 drawImage(i.getImage(),mx,my,this);
}    
}
@凌驾
公共无效鼠标标记(鼠标事件e){
//如果(e.getSource==image1)
//{
//操纵单个图片,但不以这种方式工作
//}
mx=e.getX();
my=e.getY();
重新油漆();
}    
}

不要绘制图像,请使用JLabel显示图像

JLabel imageLabel1 = new JLabel(image1);

如果您将其添加到面板中,它将显示您的图像。您可以通过访问标签访问图像。顺便说一下,将侦听器添加到所有标签中,这样
getSource()
将返回相关标签。

不要绘制图像,请使用jlabel显示它们

JLabel imageLabel1 = new JLabel(image1);

如果您将其添加到面板中,它将显示您的图像。您可以通过访问标签访问图像。顺便说一下,将您的侦听器添加到所有标签中,这样
getSource()
将返回相关标签。

我发现代码的几个部分存在问题。首先,您的图像总是一个接一个地绘制,因为

for (ImageIcon i : myList)
{
   g.drawImage(i.getImage(), mx, my, this);
}
mx
my
用于所有图像。所以你需要每个图像都有自己的坐标


您缺少的另一部分是确定第一次单击鼠标时鼠标下的图像的代码。您可能需要获得图像的宽度和高度(然后计算另一个角的位置),但是,在这之后,确定单击x y是否在矩形图像的边界内是一个简单的数学问题。请注意,您需要为所有三个图像确定这一点


关于
getSource()
,您需要了解的是,它在
addMouseMotionListener行中返回隐式参数(this)


您的JPanel自己监听也有点奇怪。

我发现代码的几个部分存在问题。首先,您的图像总是一个接一个地绘制,因为

for (ImageIcon i : myList)
{
   g.drawImage(i.getImage(), mx, my, this);
}
mx
my
用于所有图像。所以你需要每个图像都有自己的坐标


您缺少的另一部分是确定第一次单击鼠标时鼠标下的图像的代码。您可能需要获得图像的宽度和高度(然后计算另一个角的位置),但是,在这之后,确定单击x y是否在矩形图像的边界内是一个简单的数学问题。请注意,您需要为所有三个图像确定这一点


关于
getSource()
,您需要了解的是,它在
addMouseMotionListener行中返回隐式参数(this)

你的JPanel听自己说话也有点奇怪

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

因为您不能使用JLabels,并且如果您想获得正在选择的当前图像。您必须在图像列表中反复添加并检查所选的图像

目前,您保留了ImageIcon的列表,并且没有直接的方法来获取ImageIcon的边界以检查选择

如果我是您,我将向当前图像图标添加属性(边界),以便于我们检查鼠标是否正在单击图像:

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;
@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
的位置。因此,只有最后选定的图像才会移动


paintComponent(g)
方法中,如果您创建了一个自定义的图像类,如
MyImage
,则可以使用
.draw(g)

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    for (MyImage i : myList)
        i.draw(g);
}
这是我过去用同样的技术做的一个拼图游戏:

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

因为您不能使用JLabels,并且如果您想获得正在选择的当前图像。您必须在图像列表中反复添加并检查所选的图像

目前,您保留了ImageIcon的列表,并且没有直接的方法来获取ImageIcon的边界以检查选择

如果我是您,我将向当前图像图标添加属性(边界),以便于我们检查鼠标是否正在单击图像:

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;
@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
的位置。因此,只有最后选定的图像才会移动


在您的
paintComponent(g)
方法中,如果您创建了一个像
MyImage.draw(g)