Hej leutz,
ich programmiere in einer Java -GUI in Netbeans an einem Memory. Ich bekomme es leider nicht hin, dass meine Spielkarten in meinem GridLayout angezeigt werden.
Die Spielkarten befinden sich in einen angelegten Ordner. Diese möchte ich per Zufall (Array) aufrufen, damit sie auf meiner Oberfläche angezeigt werden nach eine Karte aufgedeckt wurde.
Ich habe die Bilder per getResource gespeichert, ihnen einen Namen zugewiesen und möchte diese per Zufall aus dem Array auslesen.
Ich wäre euch für eine Hilfestellung sehr dankbar, bastle wirklich schon ewig, dass es endlich läuft
ich programmiere in einer Java -GUI in Netbeans an einem Memory. Ich bekomme es leider nicht hin, dass meine Spielkarten in meinem GridLayout angezeigt werden.
Die Spielkarten befinden sich in einen angelegten Ordner. Diese möchte ich per Zufall (Array) aufrufen, damit sie auf meiner Oberfläche angezeigt werden nach eine Karte aufgedeckt wurde.
Ich habe die Bilder per getResource gespeichert, ihnen einen Namen zugewiesen und möchte diese per Zufall aus dem Array auslesen.
Ich wäre euch für eine Hilfestellung sehr dankbar, bastle wirklich schon ewig, dass es endlich läuft
Java:
package memoryspiel;
import java.awt.event.MouseEvent;
import javax.swing.*;
public class Memory extends javax.swing.JFrame {
private static Memory Memory;
private ImageIcon bild1 = new javax.swing.ImageIcon(getClass().getResource("/kartenbilder/bild1.png"));
private ImageIcon bild2 = new javax.swing.ImageIcon(getClass().getResource("/kartenbilder/bild2.png"));
private ImageIcon bild3 = new javax.swing.ImageIcon(getClass().getResource("/kartenbilder/bild3.png"));
/** Creates new form Memory */
/* Konstruktor für Spielfeld-Objekte */
public Memory() {
/* Zunächst wird im JFrame nur ein leeres Panel mit GridLayout angelegt */
/* initComponents() wird von NetBeans generiert und kann nicht geändert werden */
initComponents();
/* Die folgende Methode wird das Spielfeld füllen*/
buildSpielkarten();
}
/* Methode zum Anlegen von Feldern und zum Befüllen des Spielfelds */
public void buildSpielkarten() {
// Die folgende Methode wird das Spielfeld füllen
/* Das Spielbrett wird zeilenweise mit Feldern (JLabel-Objekten) befüllt */
for (int zeile = 0; zeile < 4; zeile++) {
/* Spalte für Spalte setzen wir nun die Felder */
for (int spalte = 0; spalte < 4; spalte++) {
/* Neues JLabel-Objekt erzeugen und auf opaque setzen */
JLabel jKarte = new JLabel(this.getCharacter());
jKarte.setIcon(bildKarteRückseite);
jKarte.setOpaque(true);
/* Jede Karte bekommt einen eigenen "Listener" für die Event-
Behandlung zugeordnet */
jKarte.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
KarteAngeklickt(evt);
}
});
/* Die Karte auf das Panel bringen */
spielfeld.add(jKarte);
/* die Karte im Array merken */
jKarten[zeile][spalte] = jKarte;
}
}
}
/* Einfügen der Bilder, die oben angesprochen wurden */
private ImageIcon[] labels = {bild1, bild2, bild3, bild4, bild5, bild6, bild7, bild8};
private int labelsLength = labels.length;
private String getCharacter()
{
// Waehlt einen Label zufaellig aus dem Array
// und entfernt ihn daraus.
int pos = (int) (Math.random() * 100) % labelsLength;
String c = labels[pos].toString();
// Luecke im Array schliessen:
for (int i = pos + 1; i < labelsLength; i++)
{
labels[i - 1] = labels[i];
}
labelsLength--;
return c;
}
public static void main(String[] args) throws Exception
{
Memory m = new Memory();
}
// Zähler für die entdeckten Paare */
private int paarKarten = 0;
/* Ereignisbehandlungsmethode für angeklickte Karten auf dem Spielfeld - auf Eingabe warten */
private void KarteAngeklickt(MouseEvent evt) {
/* Durch Befragen des Events herausfinden, welche Karte angeklickt wurde */
JLabel aufgedeckteKarte = (JLabel) (evt.getSource());
/* Die Karte nach seinem Bild fragen */
/* getIcon(): liefert den Icon dieser Registerkarte oder null wenn keiner gesetzt ist */
Icon aktiveKarte = aufgedeckteKarte.getIcon();
Icon String = null;
/* Erste Karte aufdecken */
if (ersteKarte == null) {
/* In diesem Fall gibt es derzeit keine aktive Karte, also wird
die angeklickte Karte aktiv */
// kein Feld - nun das erste:
aufgedeckteKarte.setIcon(String);
ersteKarte = aktiveKarte;
} /* else-Zweig: es gibt also bereits eine aktive Karte. Wir decken noch
eine zweite Karte auf */
else if (zweiteKarte == null) {
// ein Feld - nun das zweite:
// aufgedeckteKarte.setEnabled(false);
// aufgedeckteKarte.uncover();
zweiteKarte = aktiveKarte;
aufgedeckteKarte.setIcon(String);
/* Vergleich der beiden Karten */
/* equals(Object): beide Objekte repräsentieren denselben Inhalt, sie sind aber nicht am selben Ort */
// Hier muss man sicherstellen, dass das Objekt, auf welchem die Methode equals aufgerufen werden soll, nicht null ist.
if (ersteKarte.equals(zweiteKarte)) {
/* Die Karten sind gleich */
System.out.println("Jawohl!");
ersteKarte = aktiveKarte;
zweiteKarte = aktiveKarte;
aufgedeckteKarte.setIcon(String);
/* Neue Auswahl vorbereiten */
ersteKarte = null;
zweiteKarte = null;
/* Zähler erhöhen */
paarKarten++;
/* Prüfung, ob bereits alle Kartenpaare gefunden wurden */
if (paarKarten == 8) {
JOptionPane.showMessageDialog(null,
"Geschafft! Spiel beendet.", "MemorySpiel",
JOptionPane.INFORMATION_MESSAGE);
}
} else {
/* Die Karten sind verschieden, sie bleiben aufgedeckt bis zur nächsten Wahl */
System.out.println("Knapp daneben...");
}
} else {
ersteKarte = aktiveKarte;
zweiteKarte = null;
}
}
public static void main() {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Memory().setVisible(true);
}
});
}
/* Spielfeld aus 4 Reihen mit je 4 Karten */
private JLabel[][] jKarten = new JLabel[4][4];
/* Icons für das Kartensymbol des Spiels */
private ImageIcon bildKarteRückseite = new ImageIcon(getClass().getResource("/kartenbilder/karte_back.png"));
/* Variablen zum Merken der aktiven (=zuletzt angeklickten) Karte und dessen Icon */
private Icon ersteKarte = null;
private Icon zweiteKarte = null;
private javax.swing.JPanel spielfeld;
}
Zuletzt bearbeitet: