Javaでリスナーを使用してボタンを画像にリンクする

I am trying to create a memory game in Java. Something like this, but much more simplier -> http://www.zefrank.com/memory/

ここに私のコードです:

import javax.swing.*;

public class Memoriin {

    public static void main(String[] args) {
        JFrame frame = new MemoriinFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

そして:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class MemoriinFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    public static final int DEFAULT_HEIGHT = 600;
    public static final int DEFAULT_WIDTH = 800;
    public JButton button[] = new JButton[8];
    ArrayList icons = new ArrayList();
    ImageIcon tail = new ImageIcon("foto.jpg");

    ImageIcon photo1 = new ImageIcon("foto1.jpg");
    ImageIcon photo2 = new ImageIcon("foto2.jpg");
    ImageIcon photo3 = new ImageIcon("foto3.jpg");
    ImageIcon photo4 = new ImageIcon("foto4.jpg");
    ImageIcon photo1copy = photo1;
    ImageIcon photo2copy = photo2;
    ImageIcon photo3copy = photo3;
    ImageIcon photo4copy = photo4;



    public MemoriinFrame() {
          setTitle("Memory Game");
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
          setLayout(new GridLayout(2, 4));

          addIcons();
          for(int i = 0; i <= 7; i++) {
              button[i] = new JButton();
              button[i].setIcon(tail);
              button[i].addActionListener(new ActionListener() {
                  public void actionPerformed(ActionEvent e) {
                      performActionEventHandler();
                  }
              });
              add(button[i]);
          }

    }

    public void performActionEventHandler() {
       //how can I link each button with a specific picture?
    }

    public void addIcons() {
        icons.add(photo1);
        icons.add(photo2);
        icons.add(photo3);
        icons.add(photo4);
        icons.add(photo1copy);
        icons.add(photo2copy);
        icons.add(photo3copy);
        icons.add(photo4copy);
        Collections.shuffle(icons);
    }

    public void tailToImage(JButton button) {
        button.setIcon(icons.get(0));
        icons.remove(0);
    }
}

だから、私は特定の画像とボタンをリンクしようとしています。私はそうしようとしましたが、不要な結果がありました。ボタンをクリックすると、絵がランダムの画像に変わります。しかし、私は8つのボタンと8つの写真を持っているので、それぞれのボタンがすべて同じゲームの長い画像になるようにリンクしたい。

P.S.英語は母国語ではありません。

2

2 答え

ボタンとピクチャを関連付けるには、それらの間にマッピングを持つことが賢明です。あなたは何かのように使うことができます。

Map

以上は、ボタンとアイコンの間の非常に粗い関係です。あなたはこれを即興で行う必要があるかもしれません。このようなもの..

画像ソース:foto1からfoto4の場合、Stackoverflowから上位4人のユーザーのアバターを撮影しました。

enter image description here

ImageIcon photo1 = new ImageIcon("foto1.jpg");
ImageIcon photo2 = new ImageIcon("foto2.jpg");
ImageIcon photo3 = new ImageIcon("foto3.jpg");
ImageIcon photo4 = new ImageIcon("foto4.jpg");
ImageIcon photo1copy = new ImageIcon("foto1.jpg");
ImageIcon photo2copy = new ImageIcon("foto2.jpg");
ImageIcon photo3copy = new ImageIcon("foto3.jpg");
ImageIcon photo4copy = new ImageIcon("foto4.jpg");

Map buttonImage = new HashMap();

public MemoriinFrame() {
      setTitle("Memory Game");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
      setLayout(new GridLayout(2, 4));

      for(int i = 0; i <= 7; i++) {

          button[i] = new JButton();
          button[i].setIcon(tail);
          button[i].addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e) {
                  performActionEventHandler((JButton)e.getSource());
              }
          });
          add(button[i]);
      }

      addIcons();

}

public void performActionEventHandler(JButton clickedButton) {
    clickedButton.setIcon(buttonImage.get(clickedButton));
}

public void addIcons() {
    icons.add(photo1);
    icons.add(photo2);
    icons.add(photo3);
    icons.add(photo4);
    icons.add(photo1copy);
    icons.add(photo2copy);
    icons.add(photo3copy);
    icons.add(photo4copy);
    Collections.shuffle(icons);

    for(int i=0;i

NOTE : This is not a COMPLETE bug free answer since I was just playing with it. And it has a lot of scope to be refactored. But this should be very much enough to get you going.

3
追加された
@Dmitri:彼は匿名の内部リスナーを使用していて、このリスナーに performActionEventHandler というインスタンスメソッドを呼び出させているだけです。この例では1+です。
追加された 著者 Hovercraft Full Of Eels,
私は同じコードを書いていますが、performActionEventHandler()の中で何を書くべきか説明できますか?
追加された 著者 user721588,

Myself, I've created an ArrayList of ImageIcon (ArrayList) and have added two of each ImageIcon to it. I then call Collections.shuffle(...) on the list to randomize. Then use a HashMap and associate each button with an image. Then when the button has been pressed, set the JButton's icon to the one in the map (or null if you want to remove the icon if he guess wrong).

2
追加された