Java 操作侦听器,单击以更改图像。

Java 操作侦听器,单击以更改图像。,java,Java,我有一些图片,我需要改变点击,现在只有三个类别的图像,三个鼻子,三只眼睛和三张嘴。所以我采用了这种方法来解决问题,但我意识到这不是最好的解决方法,因为图像的数量是硬编码的,我希望它能自动改变。我需要一些想法或建议 import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.s

我有一些图片,我需要改变点击,现在只有三个类别的图像,三个鼻子,三只眼睛和三张嘴。所以我采用了这种方法来解决问题,但我意识到这不是最好的解决方法,因为图像的数量是硬编码的,我希望它能自动改变。我需要一些想法或建议

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {

    /**
     * Create the panel.
     */
    private int nose  = 1;
    private int mouth = 1;
    private int eyes = 1;   

    Color[] color ={Color.BLUE, Color.RED, Color.PINK,Color.CYAN,Color.WHITE};
    static int colorCounter =1 ;

    public ImagePanel() {

    }

    public void changeNose(){
        nose = ++nose % 3;
        nose++;
    }
    public void changeMouth(){
        mouth = ++mouth % 3;
        mouth++;
    }
    public void changeEyes(){
        eyes = ++ eyes % 3;
        eyes++;
    }   

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.green);
        g.setColor(color[colorCounter]);
        g.fillOval(40, 120, 400, 400);


        ImageIcon hat = new ImageIcon
                (ImagePanel.class.getResource("/a06Face/Images/santa.png"));
            hat.paintIcon(this, g, 160, 3);

        ImageIcon eyes1 = new ImageIcon
                (ImagePanel.class.getResource("/a06Face/Images/eyes"+eyes+".png"));
        eyes1.paintIcon(this, g,180, 200);

        ImageIcon nose1 = new ImageIcon(ImagePanel.class.getResource("/a06Face/Images/nose"+nose+".png"));
            nose1.paintIcon(this, g, 180, 300);

        ImageIcon mouth1 = new ImageIcon
                (ImagePanel.class.getResource("/a06Face/Images/mouth"+mouth+".png"));
        mouth1.paintIcon(this, g, 170, 400);
        repaint();
    }
}  

你可以用鼠标听器。 如何做到这一点:

//在类构造函数中
公共XYZ()
{
.....
计时器t=新计时器(0,新侦听器());
t、 start();
addMouseListener(新鼠标());
//节目后期
私有类鼠标扩展了MouseAdapter
{
公共无效mouseClicked(MouseEvent e)
{
.doMethod(e.);
}

}
好吧,让我们试试这个。让我们定义一个实例字段,其中包含系统中的所有图像项。这可能类似于

private List<ImageIcon> imgIcons = new ArrayList<ImageIcon>;

从需要添加图像的任何位置调用此方法。然后,当需要计算此面板中的图像数时,您可以获得阵列的大小。希望这有帮助。快乐编码!

您可以再解释一下您的问题吗?我不清楚您要做什么?3个鼻子、嘴巴等是什么意思?我有三个不同的t png文件名为,nose1,nose2,nose3。我想在每次单击时切换它们,所以我所做的是使用模运算符来保持图像数不超过3,因此我不会超出范围。但是正如你所看到的,我的changeEyes,changeMouth,changeNose都是硬编码的,用于处理3个图像。我想实现一个d不同的方法是,我注意到,如果我想添加另一个图像,我必须更改字段值和方法值。我不能使用鼠标侦听器,因为我不熟悉它,我已经知道如何在JButton事件侦听器上执行它。该程序按预期工作,但我认为它的设计很差,我硬编码了png fil的数量我建议大家更熟悉它,以备将来参考。让我想出一个不同的解决方案。你可以在这里阅读更多关于MouseListener的信息:my(imgIcon)只是指向我图像的路径,对吗?因为我收到一个错误,说“不适用于参数(字符串)”任何一种方法都可以。你可以发送路径并在方法内创建ImageIcon,或者在此处传递图标并将其添加到列表中。我认为前面的方法更好。只需发送路径,创建ImageIcon并将其添加到方法内的列表中。明白了,我会尝试一下。
private void addImageIcon(ImageIcon imgIcon){
    this.imgIcons.add(imgIcon);
}