2017-03-03 27 views
0

我有一些图片,我需要改变点击,现在只有三个图像的每个类别,3个鼻子,3个眼睛和3个嘴巴。所以我采取这种方法来解决我的问题,但是我意识到这不是最好的方式去解决它,因为图像的数量是硬编码,我希望它改变dinamically。我需要一些想法或建议。动作侦听器,点击更改图像。

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(); 
    } 
} 
+0

你能解释一下你的问题吗?我不清楚你打算怎么做? 3鼻子,嘴巴等是什么意思? –

+0

我有三个不同的名为nose1,nose2,nose3的png文件。我想每次点击时切换它们,所以我已经使用模运算符来保持图像数量超过3,因此我不会超出范围。但正如你可以看到我的变化眼睛,改变嘴巴,改变鼻子硬编码与3图像工作。我想实现一个不同的方式来做到这一点,我注意到,如果我想添加另一个图像,我必须更改字段值和方法值。 – mrKapplan

回答

0

您可以使用MouseListener。 如何做到这一点:

//in your Class constructor 
 
public XYZ() 
 
{ 
 
..... 
 
Timer t = new Timer(0,new Listener()); 
 
t.start(); 
 
addMouseListener(new Mouse()); 
 
// later in program 
 
private class Mouse extends MouseAdapter 
 
{ 
 
public void mouseClicked(MouseEvent e) 
 
{ 
 
<object>.doMethod(e.<otherMethod>); 
 
} 
 
}

这仅仅是如何使用一个通用的MouseListener。修改此以适合您的程序。

+0

我不能使用mouseListener,因为我不熟悉它,我已经想出了如何在JButton事件监听器上做到这一点。该程序按预期工作,但我认为它糟糕的设计,我硬编码了即时通讯工作的PNG文件的数量。 – mrKapplan

+0

我建议您更熟悉它以备将来参考。让我想出一个不同的解决方案。你可以在这里阅读更多关于MouseListener的信息:https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseListener.html –

0

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

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

然后编写一个方法将图像图标添加到此列表中。它可能看起来像这样。

private void addImageIcon(ImageIcon imgIcon){ 
    this.imgIcons.add(imgIcon); 
} 

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

+0

我的(imgIcon)它只是我的图像的路径,对吗?因为即使得到一个错误说“不适用于参数(字符串)” – mrKapplan

+0

任何方式都很好。您可以发送路径并在方法内部创建ImageIcon,或者在此处传递图标,并将其添加到列表中。我认为以前的方式更好。只需发送路径,创建一个ImageIcon并将其添加到方法内的列表中。 –

+0

明白了,我会给它一个。 – mrKapplan