2017-03-10 1 views
-3

UPDATE: Ich habe nur jede Taste manuell codiert. Trotzdem danke.FIXED: Java Memory Game - Java Andere Bilder werden nicht angezeigt

Ich versuche, ein Memory-Spiel in Java geschrieben zu machen. Aus irgendeinem Grund rendert Java alle Bilder als gleich. Es scheint das neueste Bild auf alle Schaltflächen zu übertragen, wenn darauf geklickt wird.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import java.util.ArrayList; 

import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

/** 
* @author Steven 
* 
*/ 
public class Memory extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private static final int GRIDSIZE = 4; 
    private PicButton[][] liteBut = new PicButton[GRIDSIZE][GRIDSIZE]; 
    private Random rand = new Random(); 
    private ClassLoader cl = this.getClass().getClassLoader(); 
    private String[] imagelist = {"images/image01.jpg", "images/image02.jpg", "images/image03.jpg", "images/image04.jpg"}; 
    private ArrayList<String> images = new ArrayList<String>(); 
    private volatile String icon = ""; 

    public Memory() { 
     initGUI(); 
     setTitle("Memory"); 
     setResizable(false); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    private void initGUI() { 
     assignimages(); 
     TitleLabel framedTitle = new TitleLabel("Memory"); 
     add(framedTitle, BorderLayout.PAGE_START); 

     JPanel centerPanel = new JPanel(); 
     centerPanel.setLayout(new GridLayout(GRIDSIZE, GRIDSIZE)); 
     add(centerPanel, BorderLayout.CENTER); 

     for (int row = 0; row < GRIDSIZE; row++) { 
      for (int col = 0; col < GRIDSIZE; col++) { 
       liteBut[row][col] = new PicButton(row, col); 

       if (row == 0) { 
        if (col == 0) { 
         icon = images.get(0); 
         System.out.println(icon); 
        } else if (col == 1) { 
         icon = images.get(1); 
         System.out.println(icon); 
        } else if (col == 2) { 
         icon = images.get(2); 
         System.out.println(icon); 
        } else if (col == 3) { 
         icon = images.get(3); 
         System.out.println(icon); 
        } 

       } else if (row == 1) { 
        if (col == 0) { 
         icon = images.get(0); 
         System.out.println(icon); 
        } else if (col == 1) { 
         icon = images.get(1); 
         System.out.println(icon); 
        } else if (col == 2) { 
         icon = images.get(2); 
         System.out.println(icon); 
        } else if (col == 3) { 
         icon = images.get(3); 
         System.out.println(icon); 
        } 

       } 

       liteBut[row][col].addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         PicButton button = (PicButton) e.getSource(); 
         int row = button.getRow(); 
         int col = button.getCol(); 
         String id = button.getID(); 
         System.out.println("Hi from " + id); 
         liteBut[row][col].setIcon(new ImageIcon(cl.getResource(icon))); 
        } 
       }); 
       centerPanel.add(liteBut[row][col]); 
      } 
     } 

    } 

    private void assignimages() { 
     for (int x = 0; x < 4; x++) { 
      int i = rand.nextInt(GRIDSIZE); 
      images.add(imagelist[i]); 
     } 
     for (int x = 0; x < images.size(); x++) { 
      System.out.println(images.get(x)); 
     } 
    } 

    public static void main(String[] args) { 
     try { 
      String className = UIManager.getCrossPlatformLookAndFeelClassName(); 
      UIManager.setLookAndFeel(className); 
     } catch (Exception e) { 
     } 

     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Memory(); 
      } 
     }); 
    } 

    public class PicButton extends JButton { 

     private static final long serialVersionUID = 1L; 
     private static final int MAXSIZE = 150; 

     private int row = 0; 
     private int col = 0; 
     private String id = ""; 
     //private Boolean hasPic; 

     public PicButton(int row, int col) { 
      this.row = row; 
      this.col = col; 
      id = Integer.toString(row) + Integer.toString(col); 
      System.out.println(id); 
      setBackground(Color.BLACK); 
      Dimension size = new Dimension(MAXSIZE, MAXSIZE); 
      setPreferredSize(size); 

     } 

     public int getRow() { 
      return row; 
     } 

     public int getCol() { 
      return col; 
     } 

     public String getID() { 
      return id; 
     } 

     public void setImage() { 
      setBackground(Color.RED); 
      //hasPic = true; 
     } 

     public void clearImage() { 
      setBackground(Color.BLACK); 
      //hasPic = false; 
     } 
    } 

    public class TitleLabel extends JLabel { 

     private static final long serialVersionUID = 1L; 

     public TitleLabel(String title) { 
      Font titleFont = new Font(Font.SERIF, Font.BOLD, 32); 
      setFont(titleFont); 
      setHorizontalAlignment(JLabel.CENTER); 
      setText(title); 
      setBackground(Color.BLACK); 
      setForeground(Color.WHITE); 
      setOpaque(true); 
     } 
    } 

} 
+0

Wir laden Ihren Code nicht herunter. Fügen Sie die relevanten Bits hier bitte ein. – shmosel

+1

Bitte machen Sie auch ein minimales, vollständiges und überprüfbares Beispiel. http://StackOverflow.com/Help/Mcve –

Antwort

1
liteBut[row][col].setIcon(new ImageIcon(cl.getResource(icon))); 

wird die Zuordnung des letzten bekannten Wert von icon als das Bild auf die Taste (Dies ist ein Beispiel Feld, so dass er sich erinnert), ist dies nicht der „Wert“ der Taste zugewiesen, aber die Letzter Wert zugewiesen icon durch die for-loop, in dem Sie die Tasten erstellen, so im Grunde, alle Tasten erhalten die letzten icon, stattdessen liefern die Symbol Wert der PictureButton selbst, so dass Sie die Schaltfläche "aktualisieren" können, wenn es geklickt wird.

Diese Funktion könnte sich auf die Schaltfläche selbst beziehen, was die Verwaltung vereinfacht

+0

Haben Sie irgendwelche Ideen, wie dies zu implementieren ist oder einfach die For-Loops abbrechen und manuell codieren? –

+0

Wie ich schon sagte, übergeben Sie den Icon-Wert an den 'PictureButton', lassen Sie sich damit beschäftigen und aktualisieren Sie sich selbst. – MadProgrammer

+0

@ S.Conaway Basierend auf dem, was Sie anscheinend versuchen, kann [dieses Beispiel] (http://stackoverflow.com/queses/16292498/swingworker-thread-sleep-oder-javax-swing-timer-ich-brauche-zu-einfügen-a-pause/16293498 # 16293498) kann helfen – MadProgrammer