Привязать кнопку к изображению с помощью слушателя на Java - PullRequest
2 голосов
/ 19 декабря 2011

Я пытаюсь создать игру памяти на Java. Как то так, но намного проще -> 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<ImageIcon> icons = new ArrayList<ImageIcon>();
    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 ]

3 голосов
/ 19 декабря 2011

Чтобы связать кнопку и изображение, разумнее иметь сопоставление между ними. Вы можете использовать что-то вроде.

Map<JButton, ImageIcon>

Теперь вышесказанное - очень грубая связь между кнопкой и иконкой. Возможно, вам придется импровизировать на этом. Как то так ..

Источник изображения: Для foto1 через foto4 я взял аватар четырех лучших пользователей из Stackoverflow.

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<JButton, ImageIcon> buttonImage = new HashMap<JButton, ImageIcon>();

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<icons.size();i++){
        buttonImage.put(button[i], icons.get(i));
    }
}

ПРИМЕЧАНИЕ : Это не ПОЛНЫЙ ответ без ошибок, так как я просто играл с ним. И это имеет много возможностей для рефакторинга. Но этого должно быть достаточно, чтобы вы пошли.

2 голосов
/ 19 декабря 2011

Я сам создал ArrayList для ImageIcon (ArrayList<ImageIcon>) и добавил к нему по два каждого ImageIcon. Затем я вызываю Collections.shuffle(...) в списке, чтобы рандомизировать. Затем используйте HashMap<JButton, Icon> и свяжите каждую кнопку с изображением. Затем, когда кнопка была нажата, установите значок JButton на значок на карте (или ноль, если вы хотите удалить значок, если он угадает неправильно).

...