我试图弄清楚如何在我的活动中访问使用paintComponent绘制的不同图像(在分配中不允许使用JLabel)。
拖动时,我只想用鼠标拖动移动一个图像,我似乎无法访问"当前图像"使用e.getSource()。
我的paintComponent
此刻会同时移动所有(3)张图片。
我的问题是:如何使用mouseDragged来获取单个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();
}
}
答案 0 :(得分:4)
我试图弄清楚如何在我的活动中访问使用paintComponent绘制的不同图像(在作业中不允许使用JLabel)
由于您无法使用JLabel,并且您想要选择当前图像。您将不得不遍历图像列表添加检查选择哪一个。
目前您保留了一个ImageIcon列表,并且没有直接的方法来获取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;
在您的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
的位置。因此,只有最后选择的图像才会移动。
在paintComponent(g)
方法中,如果您创建了像.draw(g)
这样的自定义图像类,则可以使用MyImage
:
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
for (MyImage i : myList)
i.draw(g);
}
这是我过去使用相同技术进行的曲线锯拼图:
答案 1 :(得分:1)
不要绘制图像,使用JLabel进行显示。
JLabel imageLabel1 = new JLabel(image1);
如果您将其添加到面板,它将显示您的图像。您可以通过到达标签来获取图像。顺便说一句,将您的监听器添加到所有标签,以便getSource()
返回相关标签。
答案 2 :(得分:0)
我在代码的几个部分看到了问题。首先,您的图像将始终一个接一个地绘制,因为
for (ImageIcon i : myList)
{
g.drawImage(i.getImage(), mx, my, this);
}
mx
和my
用于所有图片。所以你需要每个图像都有自己的坐标。
您缺少的另一部分是用于确定首次单击鼠标时鼠标下面的图像的代码。您可能需要获取图像的宽度和高度(然后计算另一个角落的位置),但之后,确定点击x y是否在矩形图像的边界内是一种简单的数学运算。请注意,您需要为所有三个图像确定这一点。
你需要意识到的关于getSource()
的事情是它返回行addMouseMotionListener(this);
你的JPanel听自己也有点奇怪。