2017-03-03 5 views
0

私はクリックで変更する必要があるいくつかの画像を持っています、今は各カテゴリの3つの画像、3つの鼻、3つの目と3つの口があります。だから私は私の解決策にこのアプローチを取ったが、私はこれが最善の方法ではないことに気付く。なぜなら、画像の数は難しいコードになっているからだ。私はいくつかのアイデアや提案が必要です。アクションリスナー。クリック時に画像を変更します。

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

私は3つの異なるpngファイルnose1、nose2、nose3を持っています。そして私はクリックするたびにそれらを切り替えたいので、画像の数が過去3回にならないようにモジュラス演算子を使用していますので、範囲外にはなりません。しかし、あなたが私のchangeEyes、changeMouth、changeNoseを見ることができるように、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

my(imgIcon)の画像へのパスを参照してください。 「引数(String)に適用されない」というエラーが表示されるので、 – mrKapplan

+0

どちらの方法でも問題ありません。メソッド内でパスを送信しImageIconを作成するか、ここにアイコンを渡してリストに追加するだけです。私は前の方法が良いと思います。パスを送信し、ImageIconを作成し、メソッド内のリストに追加するだけです。 –

+0

それを持って、私はそれを行ってあげるよ。 – mrKapplan

関連する問題