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