2017-03-03 52 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