Grundlegendes mit swing und klassen

Status
Nicht offen für weitere Antworten.

dörte

Mitglied
hallo zusammen!

gleich vorab: ich freue mich über jede hilfreiche antwort. da ich sonst eifriger actionScripter bin, kann ich nicht sagen, dass mir programmierung unendlich schwer fällt.
aber bei java fehlt mir, glaube ich, ein wenig der zündende gedanke.

schleife geht weiter bis keine bilder mehr das sind, danach wird ein highscore ausgegeben.

natürlich erwarte ich jetzt keinen kompletten programmcode, doch wie gehe ich an die sache ran?
welche klassen schreibe ich? welche klassen/methoden benötige ich, um die bilder
innerhalb des koffers für zwei sekunden auftauchen zu lassen, um sie danach wieder verschwinden zu lassen?
dabei soll java darauf achten, welche bilder bereits vorgekommen sind?

das sind viele fragen, das ist mir klar. aber mir fehlt einfach der einstieg.
ich wäre super dankbar für ein paar anregungen!

schon mal vielen dank!!!!

gruß von dergestalt
 

ARadauer

Top Contributor
welche klassen/methoden benötige ich, um die bilder
innerhalb des koffers für zwei sekunden auftauchen zu lassen, um sie danach wieder verschwinden zu lassen

gibt da einen interessanten Ansatz der Anfängern helfen soll Objekte und Methoden zu finden. Also Objekte sind Nomen und Methoden sind Verben.
Objekte:
Bild
Koffer
Methoden
auftauchen (show)
verschwinden (hide)


Die Gui funktioniert schon oder? Versuch einfach mal ein Bild anzuzeigen. Ich würd da ein Image nehmen. Anscheinden funktionieren Labels aber auch JLabel foo = new JLabel(new ImageIcon(this.class.getClassLoader().getResource("bar.jpg")));

dann wirst du einen Timer benötigen, für die 2 Sekunden und eine ArrayList um eine Bilder zu halten...
 

dörte

Mitglied
erstmal danke für die schnelle antwort.

Die Gui funktioniert schon oder? Versuch einfach mal ein Bild anzuzeigen. Ich würd da ein Image nehmen. Anscheinden funktionieren Labels aber auch JLabel foo = new JLabel(new ImageIcon(this.class.getClassLoader().getResource("bar.jpg")));

also die gui hab ich schon mal gestartet und sie geht auch. keine fehlermeldungen a.ä. alle bilder, die du bis jetzt siehst sind per ImageIcon, also im endeffekt so wie du geschrieben hast, auf labels gesetzt. ich denke das meintest du?!



gibt da einen interessanten Ansatz der Anfängern helfen soll Objekte und Methoden zu finden. Also Objekte sind Nomen und Methoden sind Verben.
den find ich ja schon mal ganz gut. werd dann mal so anfangen. nochmals danke!
 

dörte

Mitglied
ich dachte mir schon, dass ich das wissen des forums noch öfter benötige.

ich habe mir jetzt eine klasse Bilder mit dem array für die bilder erstellt, mit den pfadangaben als string. warum? nun ja in einem beispiel hat unser prof. das auch so gemacht. aber ich bin natürlich für andere vorschläge mehr als offen...

jetzt hängts an zwei stellen:
die erste leichtere frage ist, wie ich das zu erscheinende bild auf dem koffer platziere?

die zweite um einiges kompliziertere frage ist:
wie schaffe ich es, dass ich die bilder unten mit den zu erscheinenden bildern verknüpfe? damit meine ich, wie ich java sage, du hast jetzt bild 3, 4 und 5 angezeigt, jetzt achte auch darauf, ob der user auch bild 3, 4 und 5 anklickt.
da fehlt mir irgendwie die synthax, um das in java zu übersetzen :bahnhof:
 

Marco13

Top Contributor
dergestalt hat gesagt.:
wie schaffe ich es, dass ich die bilder unten mit den zu erscheinenden bildern verknüpfe? damit meine ich, wie ich java sage, du hast jetzt bild 3, 4 und 5 angezeigt, jetzt achte auch darauf, ob der user auch bild 3, 4 und 5 anklickt.
da fehlt mir irgendwie die synthax, um das in java zu übersetzen :bahnhof:

In diesem Sinne fehlt uns/mir die "Synthax" um deine Frage in eine Antwort umzubiegen :wink:

Die erste Frage ist recht leicht zu beantworten: Dort, wo auch der Koffer (Hintergrund) gemalt wird, werden dann einfach auch die anderen Bilder gemalt. Wenn der Hintergrund nur ein ImageIcon ist, hast du halt verloren :wink: dann würde ich dir empfehlen, den Hintergrund einfach durch überschreiben der paintComponent-Methode eines JPanels zu zeichnen, mit
graphics.drawImage(0,0,hintergrundImage,null);
und die anderen Bilder eben mit
graphics.drawImage(123,456,einImage,null);
Die Alternative wäre, für jedes Bild ein ImageIcon zu verwenden, aber ... Hm. :?

Die Zweite Frage: Du misst irgendeine Möglichkeit scahffen, die Bilder zu identifizieren. Wenn du die Bilder als Array von Image-Objekten lädst, kann das z.B. der ArrayIndex sein. Die Indizes der Bilder, die Im Koffer angezeigt wurden, werden dann in eine
HashSet<Integer> bilderImKoffer = ...
gelegt, und wenn man auf ein Bild klickt, kann mit
bilderImKoffer.contains(indexVomAngeklicktenBild);
abfragen, ob das Bild im Koffer war, und es mit
bilderImKoffer.remove(indexVomAngeklicktenBild);
aus dem Set entfernen. Wenn das Set leer ist, hat man alle Bilder gefunden.

Aber ... es gibt 1000 Möglichkeiten, das zu machen, und das war nur auf Basis der (unpräzisen) Frage wil-wüst ins Blaue getippt.
 

dörte

Mitglied
will das ganze mal besser definieren:

ich möchte ja ein ich-packe-meinen-koffer-spiel programmieren.
also soll das programm folgendermaßen vorgehen:
innerhalb des koffers werden jpegs der gleichen größe angezeigt. diese korrelieren mit den bereits vorhandenen bilder unterhalb des koffers (da sollen noch mehr dazu kommen, der screenshot oben zeigt meine bisherige ausgangsposition).
das spiel geht los und zeigt, sagen wir mal, die mightymouse an. und das eben am besten innerhalb der "grenzen" des koffers. der spieler drückt unten auf die mightymouse, was die übereinstimmung ergibt. also richtig!
nächste runde: es wird wieder die mighty mouse angezeigt + ein weiteres bild, in diesem falle die tastatur.
der spieler drückt unten. mighty mouse + tastatur.
und so weiter, am ende sollen es dann 15 gegenstände werden.

meine überlegungen zu dem spiel waren folgende:


  • ich brauche ein array/arraylist
    dann eine zufallszahl, die aus dem array die bilder ausliest (random)
    dann ein bildausgabe, die ca. 2 sek. das bild anzeigt(Und da happerts), ausblendet und das nächste anzeigt, wieder für 2sek. je nach dem in welcher runde man sich befindet (Timer)
    eine "vergleichsoperator", der die angezeigten mit den gedrückten vergleicht (Und da happerts)

da sind meine bisherigen versuche (ja, ich muss in NetBeans arbeiten):

Code:
/*
 * GameFrame.java
 *
 * Created on 17. Januar 2008, 09:06
 */

package PackeDeinenKoffer;

/**
 *
 * @author  Max
 */
public class GameFrame extends javax.swing.JFrame {
    
    /** Creates new form GameFrame */
    public GameFrame() {
        initComponents();
        
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Erzeugter Quelltext ">
    private void initComponents() {
        jPanelBildbereich = new javax.swing.JPanel();
        jLayeredPaneBild = new javax.swing.JLayeredPane();
        jPanelKoffer = new javax.swing.JPanel();
        jLabelKofferBild = new javax.swing.JLabel();
        jTextFieldAnzahlBegriffe = new javax.swing.JTextField();
        jTextFieldPunkte = new javax.swing.JTextField();
        jLabelGemerkteBildertxt = new javax.swing.JLabel();
        jLabelScore = new javax.swing.JLabel();
        jLabelKofferGestapelt = new javax.swing.JLabel();
        jPanelButtons = new javax.swing.JPanel();
        jLayeredPaneButtons = new javax.swing.JLayeredPane();
        jLabelTast = new javax.swing.JLabel();
        jLabelMighty = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jPanelBildbereich.setLayout(new java.awt.GridLayout());

        jPanelBildbereich.setBackground(new java.awt.Color(112, 38, 9));
        jPanelBildbereich.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanelKoffer.setOpaque(false);
        jLabelKofferBild.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/koffer.gif")));

        org.jdesktop.layout.GroupLayout jPanelKofferLayout = new org.jdesktop.layout.GroupLayout(jPanelKoffer);
        jPanelKoffer.setLayout(jPanelKofferLayout);
        jPanelKofferLayout.setHorizontalGroup(
            jPanelKofferLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelKofferLayout.createSequentialGroup()
                .add(73, 73, 73)
                .add(jLabelKofferBild, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanelKofferLayout.setVerticalGroup(
            jPanelKofferLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanelKofferLayout.createSequentialGroup()
                .add(jLabelKofferBild, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 372, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanelKoffer.setBounds(0, 0, 440, 370);
        jLayeredPaneBild.add(jPanelKoffer, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jTextFieldAnzahlBegriffe.setText("00");
        jTextFieldAnzahlBegriffe.setBounds(500, 70, 30, 28);
        jLayeredPaneBild.add(jTextFieldAnzahlBegriffe, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jTextFieldPunkte.setText("000");
        jTextFieldPunkte.setBounds(500, 140, 38, 28);
        jLayeredPaneBild.add(jTextFieldPunkte, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jLabelGemerkteBildertxt.setFont(new java.awt.Font("Myriad Pro", 1, 14));
        jLabelGemerkteBildertxt.setText("Gemerkte Bilder");
        jLabelGemerkteBildertxt.setBounds(500, 36, 110, 20);
        jLayeredPaneBild.add(jLabelGemerkteBildertxt, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jLabelScore.setFont(new java.awt.Font("Myriad Pro", 1, 14));
        jLabelScore.setText("Score");
        jLabelScore.setBounds(500, 116, 50, 20);
        jLayeredPaneBild.add(jLabelScore, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jLabelKofferGestapelt.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/kofferGestappelt.jpg")));
        jLabelKofferGestapelt.setBounds(490, 0, 180, 380);
        jLayeredPaneBild.add(jLabelKofferGestapelt, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jPanelBildbereich.add(jLayeredPaneBild);

        jPanelButtons.setLayout(new java.awt.GridLayout());

        jPanelButtons.setBackground(new java.awt.Color(223, 125, 125));
        jPanelButtons.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jLabelTast.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/appleKeyboard.jpg")));
        jLabelTast.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jLabelTast.setBounds(10, 10, 70, 60);
        jLayeredPaneButtons.add(jLabelTast, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jLabelMighty.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/mightyMouse.jpg")));
        jLabelMighty.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jLabelMighty.setBounds(90, 10, 81, 60);
        jLayeredPaneButtons.add(jLabelMighty, javax.swing.JLayeredPane.DEFAULT_LAYER);

        jPanelButtons.add(jLayeredPaneButtons);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jPanelButtons, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 665, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jPanelBildbereich, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 665, Short.MAX_VALUE))
                .add(20, 20, 20))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(33, 33, 33)
                .add(jPanelBildbereich, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 376, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(20, 20, 20)
                .add(jPanelButtons, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 166, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GameFrame().setVisible(true);
            }
        });
    }
    
    // Variablendeklaration - nicht modifizieren
    private javax.swing.JLabel jLabelGemerkteBildertxt;
    private javax.swing.JLabel jLabelKofferBild;
    private javax.swing.JLabel jLabelKofferGestapelt;
    private javax.swing.JLabel jLabelMighty;
    private javax.swing.JLabel jLabelScore;
    private javax.swing.JLabel jLabelTast;
    private javax.swing.JLayeredPane jLayeredPaneBild;
    private javax.swing.JLayeredPane jLayeredPaneButtons;
    private javax.swing.JPanel jPanelBildbereich;
    private javax.swing.JPanel jPanelButtons;
    private javax.swing.JPanel jPanelKoffer;
    private javax.swing.JTextField jTextFieldAnzahlBegriffe;
    private javax.swing.JTextField jTextFieldPunkte;
    // Ende der Variablendeklaration
    
}

die klasse bilder:

Code:
import java.util.*;

/**
 *
 * @author Max
 */
public class Bilder {
    //Erstellung eines Bilder - Arrays
    private String[] bilderListe = {"/img/appleKeyboard.jpg","/img/mightyMouse.jpg"};
   
    
    public String getBild(int i){
        return bilderListe[i];
    }
    
}

und ne versuchte timerklasse:


Code:
import java.util.*;
/**
 *
 * @author Max
 */
public class Timer extends TimerTask {
    
    /** Creates a new instance of Timer */
    public Timer() {
    }

    public void run() {
    }
    
}

ich weiß eben einfach nicht, wo der ganze code reinsoll. in die klasse bilder oder gameFrame? welche klassen soll ich anlegen? wo muss ich was überschreiben. es ist mir bewusst, dass das eine menge grundlagen fragen sind, aber die beispiele im netz, vor allem zu swing, sind irgendwie nicht ganz in netbeans zu übertragen.

ich danke jedem, der sich die mühe macht, mir zu helfen. aber ich bin echt am abkac... und ich brauch diese lösung unbedingt. schon mal vielen, vielen dank!

wer dann mal was in actionScript braucht :wink:
 

Marco13

Top Contributor
Ach so ja - wenn es an allem hapert, was man nicht im Netbeans-GUI-Editor zusammenklicken kann, ist das ein etwas allgemeineres Problem. Will jetzt nicht mir MVC oder so anfangen, daher nur ein paar (Pseudo-)Codezeilen....

Code:
class KofferPanel extends JPanel
{
    private Image kofferImage;
    private ArrayList<Image> imagesToShow....

    private Image currentImage = null;
    private int currentX 
    private int currentY

    public KofferImage()
    {
        kofferImage = lade bild...
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(0,0,kofferImage,this);
        if (currentImage != null)
        {
            g.drawImage(currentX, currentY, currentImage, this);
        }
    }

    public void addImageToShow(Image image)
    {
         imagesToShow.add(image);
    }

    public void startGame()
    {  
        Thread t = new Thread(new Runnable()
        {
            public void run()
            {
                for (int i=0; i<imagesToShow.size(); i++)
                { 
                    currentX = random...
                    currentY = random...
                    currentImage = imagesToShow.get(i);
                    repaint();

                    Thread.sleep(2000); 
                }
                currentImage = null;
                repaint();
            }
         });
         t.start();



}
Hab grad nicht mehr Zeit.
 

dörte

Mitglied
super, schon mal danke :applaus:
hab den code durchgelesen und soweit verstanden(denke ich).

hab grad versucht deinen code an mich anzupassen, leider funzt da nischt. ich hab also bei netbeans eine neue klasse angelegt und deinen code eingefügt. in der GameFrame - Klasse hab ich in die main() Methode startGame() eingesetzt.
so siehts jetzt aus:

Code:
/*
 * KofferPanel.java
 *
 * Created on 17. Januar 2008, 16:00
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package PackeDeinenKoffer;
import java.awt.Graphics;
import java.awt.Image;
import java.util.*;
import javax.swing.JPanel;
/**
 *
 * @author Max
 */
public class KofferPanel extends JPanel {
    private Image kofferImage;
    private Image mightyMouse = "/img/mightyMouse.jpg";
    private Image appleKeyboard ="/img/appleKeyboard.jpg";
    private ArrayList<Image> kofferStuecke = new ArrayList<Image>(); 
    

    private Image currentImage = null; 
    private int currentX; 
    private int currentY; 

    public void KofferImage() 
    { 
        kofferImage = "/img/koffer.gif"; 
    } 

    public void paintComponent(Graphics g) 
    { 
        super.paintComponent(g); 
        g.drawImage(0,0,kofferImage,this); 
        if (currentImage != null) 
        { 
            g.drawImage(currentX, currentY, currentImage, this); 
        } 
    } 

    public void addImageToShow(Image image) 
    { 
         kofferStuecke.add(image); 
    } 

    public void startGame() 
    {  
        Thread t = new Thread(new Runnable() 
        { 
            public void run() 
            { 
                for (int i=0; i<kofferStuecke.size(); i++) 
                { 
                    currentX = (int)(Math.random()*50);
                    currentY = (int)(Math.random()*50); 
                    currentImage = kofferStuecke.get(i); 
                    repaint(); 

                    Thread.sleep(2000); 
                } 
                currentImage = null; 
                repaint(); 
            } 
         }); 
         t.start(); 
}
}

was mach ich falsch? wo muss das startGame() hin? wie kriege ich darauf aufbauend hin, dass java auf die benutzereingabe wartet?
 

az

Mitglied
Hallo

Du wirst einen Button oder ein Menüitem brauchen, dem du eine Action anhängst. In der Action rufst du dann initial eine Startfunktion auf. In der wird das Spiel "gestartet", ein Bild dem KofferPanel übergeben und das "startGame()", wie es bei dir heißt aufgerufen. Anschließend musst du noch das Bild unten in der Leiste zur Auswahl anzeigen.
Alternativ kannst du diese Funktion auch gleich mal im main aufrufen.

Dann benötigst du auf den angezeigten Bildern einen MouseListener, der darauf wartet dass jemand draufklickt. Klick jemand drauf, überprüfst du, ob dass das richtige Bild war. Wenn alle Bilder richtig angeklickt wurden musst du wieder ein Bild dem Panel dazugeben und neu zeichnen.
 

dörte

Mitglied
gut, so komme ich langsam einen schritt weiter. werd das ganze mal überdenken und mich wieder melden.
danke schon mal an az
 

az

Mitglied
Ich hab mir deinen Code kurz mal angeguckt.
Ich würd fast wetten, dass Marco diese Methode eigentlich als Konstruktor vorgesehen hatte : )

Code:
public void KofferImage() 
{
    kofferImage = "/img/koffer.gif";
}
 

Marco13

Top Contributor
Jo, und es sollte auch nicht als "Copy&Paste-Komplettlösung" dienen, sondern nur einige Stichpunktartige Hinweise zum painten der Bilder (und dem Thread, der nacheinander für jeweils 2 Sekunden die Bilder paintet) darstellen... :wink:
 

dörte

Mitglied
schönen abend zusammen,
ich wollte das ganze jetzt mal so angehen (ist denke ich nicht die java-könner lösung, aber na ja... :roll: )

- ich setze auf meinen koffer ein JLabel, wo alle bilder erscheinen sollen, und setze dessen opaque auf false.
- dann erstelle ich mir ein string array mit den pfaden zu meinen bildern.
- in der menüleiste habe ich ein menuItem spiel starten. das ist der auslöser um eine
spielStarten() - methode zu beginnen. danke an az!
- das spiel beginnt und ich lasse die bilder dadurch anzeigen, dass ich das JLabel auf opaque = true setze
und dann per JLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource(getBilddatei()))) dem JLabel das anzuzeigende bild übergebe.
- das ganze läuft natürlich in dem thread ab, den mir marco13 (danke!) vorgeschlagen hat.
- nach dem der thread vorbei ist, hole ich, je nach dem in welcher runde man ist, den ein weiteres bild oder steige aus der schleife aus um auf die eingaben des spielers zu warten.

soweit müsste das doch funktionieren?!

um jetzt das was der spieler gedrückt hat, mit dem was der computer angezeigt hat, zu vergleichen, hab ich mir folgendes gedacht:
- ich speichere alle bilder, die bereits angezeigt wurden in einem extra array, aber eben analog. soll heißen: falls die mightyMouse im alten array index nummer 4 hatte, so wird sie auch in dem neuen array unter index nummer 4 gespeichert.
- zusätzlich gebe ich allen buttons (bzw. bei mir sind das ja labels) eine nummer. soll heißen, dass der button mit der migthtyMouse auch die nummer 4 bekommt. dazu nutze ich die mouseReleased() - Methode.
- klickt der spieler auf die mightyMouse, gibt diese die zahl 4 aus
- diese zahl vergleiche ich mit der index nummer der mightyMouse in dem neuen array.
- stimmen beide überein, gehts weiter, wenn nicht gameOver

was sagt ihr dazu? ist bestimmt nicht der beste code, aber wenn er funzt... werd mich da mal dran setzen.
bin aber natürlich für andere vorschläge mehr als offen...

p.s. mal was anderes, wie kann man den code, den man bisher geschrieben hat, zwischentesten? geht das nur über die main()-Methode oder gibts da noch nen anderen weg?
 

Marco13

Top Contributor
Hm..

- das spiel beginnt und ich lasse die bilder dadurch anzeigen, dass ich das JLabel auf opaque = true setze
und dann per JLabel.setIcon(new javax.swing.ImageIcon(getClass().getResource(getBilddatei()))) dem JLabel das anzuzeigende bild übergebe.
- das ganze läuft natürlich in dem thread ab, den mir marco13 (danke!) vorgeschlagen hat.
- nach dem der thread vorbei ist, hole ich, je nach dem in welcher runde man ist, den ein weiteres bild oder steige aus der schleife aus um auf die eingaben des spielers zu warten.

Eigentlich sollte die gesamte Schleife in einem Thread laufen - aber dieser Thread darf "eigentlich" nicht 'setIcon' aufrufen (das darf nur der Event-Dispatch-Thread). (Genaugenommen war selbst in dem winzigen Codesnippet, das ich gepostet hatte, noch ein potentielles synchronisationsproblem enthalten, aber ... mal nicht vom 100sten ins 1000ste kommen....). Dass das Laden der Bilder mit getRessource... nur am Anfang einmal gemacht werden sollte, und möglichst NICHT während des eigentlichen Spiels, könnte man aber erwähnen.


- diese zahl vergleiche ich mit der index nummer der mightyMouse in dem neuen array.

Wie genau du diesen Vergleich machen willst, ist mir nicht ganz klar. Aber wenn du dort tatsächlich die Image-Objekte speicherst (und die mit "==" vergleichst) dann MUSST du die Bilder einmal am Anfang laden. Bei jedem Neuladen würde ja sonst ein neues Image-Objekt erstellt.


p.s. mal was anderes, wie kann man den code, den man bisher geschrieben hat, zwischentesten? geht das nur über die main()-Methode oder gibts da noch nen anderen weg?

Nicht so wirklich. Wenn man irgendeine komplizierte Methode hat, kann man eine Art "Unit-Test" machen, wo man (ganz billig) einfach eine main schreibt, und die Methode 'irgendwie' aufruft, um zu sehen, ob sie das gewüschte Ergebnis liefert. Aber wenn man sehen will, ob ein "Programm als ganzes" funktionert, hilft das nur bedingt...
 

dörte

Mitglied
hab nen neuen code, der aber hinten und vorne nicht funzt. hab den code auf anraten einer sehr hilfreichen person mal kommentiert.

habe drei klassen. nummer 1, darin befindet sich die main() - Methode

Code:
import java.util.*;
import java.awt.Image;
import javax.swing.JPanel;
/**
 *
 * @author  Max
 */
public class GameFrame extends javax.swing.JFrame {
    
    /** Creates new form GameFrame */
    public GameFrame() {
        initComponents();
        SpielStart starteSpiel = new SpielStart();
        
    }
dazwischen steht die von netbeans generierte initComponents();
Code:
    //ab hier habe ich eigentlich nur geraten, aber was ich mir vorgestellt habe, schreibe ich dazu
    // ereignis: label mit tastaturbild wurde gedrückt
    private void jLabelTastMouseReleased(java.awt.event.MouseEvent evt) {                                         

        BildTest tastatur = new BildTest();
        // dem label, das gedrückt wurde wird die indexNr des dazugehörigen bildes im arry gegeben
        int tastaturKennzahl = tastatur.setzeKennzahl(0);
        // dann wird die position des angezeigten bildes in dem array ermittelt
        // in dem fall ist das keyboardbild an der stelle 0 im array
        int zufallszahl = starteSpiel.getBilder(zufall);
        
        // falls die indexNr des bildes im array mit der nummer des gedrückten labels übereinstimmt
        if (tastaturKennzahl == zufallszahl){
            //dann soll eine weitere runde beginnen;
        }else //dann ist das spiel vorbei
    }                                        
    
    
    
    private SpielStart starteSpiel;
    //erzeugen einer zufallszahl, um das bild zufällig aus dem array zu holen
    private int zufall = (int)(Math.random()*starteSpiel.bilderListeLaenge());
    
    
    // beim auswählen des menüeintrags "Spiel Starten" soll das spiel gestartet werden
    private void jMenuSpielMousePressed(java.awt.event.MouseEvent evt) {                                        

        //irgendwie soll das ja in einen thread, der zwei sekunden dauert
        Thread t = new Thread(new Runnable()
        {
            public void run()
            {
                // eine schleife, die alle zwei sekunden die bilder für die runde anzeigt
                // ich habe die leere spielliste deshalb genommen, weil sie dann für die erste runde nur einmal durchlaufen wird
                // ist aber glaube ich nicht richtig???!?
                for (int i=0; i<starteSpiel.spielListeLaenge(); i++){
                    // setzen des bildes auf das jlabel
                    jLabelBilder.setIcon(new javax.swing.ImageIcon(getClass().getResource(starteSpiel.getBilder(zufall))));
                    // das angezeigte bild soll in die spielListe verschoben werden, um zu prüfen, ob das bild schon dran war
                    starteSpiel.kopiereBilder(zufall);
                    
                }
            }
        });
        t.start();
    }                                       
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GameFrame().setVisible(true);
                
            }
        });
    }
    
    
    // Variablendeklaration - nicht modifizieren                     
    private javax.swing.JLabel jLabelBilder;
    private javax.swing.JLabel jLabelGemerkteBildertxt;
    private javax.swing.JLabel jLabelKofferBild;
    private javax.swing.JLabel jLabelKofferGestapelt;
    private javax.swing.JLabel jLabelMighty;
    private javax.swing.JLabel jLabelScore;
    private javax.swing.JLabel jLabelTast;
    private javax.swing.JLayeredPane jLayeredPaneBild;
    private javax.swing.JLayeredPane jLayeredPaneButtons;
    private javax.swing.JMenuBar jMenuBar;
    private javax.swing.JMenu jMenuHilfe;
    private javax.swing.JMenuItem jMenuItemAnleitung;
    private javax.swing.JMenuItem jMenuItemBeenden;
    private javax.swing.JMenuItem jMenuItemStart;
    private javax.swing.JMenuItem jMenuItemUeber;
    private javax.swing.JMenu jMenuSpiel;
    private javax.swing.JPanel jPanelBildbereich;
    private javax.swing.JPanel jPanelButtons;
    private javax.swing.JPanel jPanelKoffer;
    private javax.swing.JTextField jTextFieldAnzahlBegriffe;
    private javax.swing.JTextField jTextFieldPunkte;
    // Ende der Variablendeklaration                   
}

die zweite klasse mit den bildern

Code:
package PackeDeinenKoffer;
import java.util.*;
/**
 *
 * @author Max
 */
public class SpielStart {
    // das array mit den bildern (vorerst mal zwei, sollte ja für die funktionsweise reichen)
    private String[] bilderListe = {"/img/appleKeyboard.jpg","/img/mightyMouse.jpg"};
    // das zweite array, worin die bereits angezeigten bilder eingespeichert werden
    private String[] spielListe = {};
    
    // methode zum holen der bilder
    public String getBilder(int bildnummer){
        return this.bilderListe[bildnummer];
    }
    //methode zum "umkopieren" der bilder
    public void kopiereBilder(int bildnummer){
        spielListe[bildnummer] = bilderListe[bildnummer];
    }
    // methode um die länge der bilderListe zu kriegen
    public int bilderListeLaenge(){
        return this.bilderListe.length;
    }
    // methode um die länge des arrays der spielListe zu kriegen
    public int spielListeLaenge(){
        return this.spielListe.length;
    }
    
}

und nummer 3:

Code:
package PackeDeinenKoffer;

/**
 *
 * @author Max
 */
// die klasse um zu testen, welcher button gedrückt wurde und ob diese mit den angezeigten übereinstimmt
public class BildTest {
    private int kennzahl;
    
    public int setzeKennzahl(int labelKennzahl){
        return this.kennzahl;
    }
  
}

außerdem habe ich die source dateien mal hochgeladen. wenn der link geht

danke! :toll:
 

Marco13

Top Contributor
Hmja... Zuerst mal: Um den Link auf die ZIP-Datei zu setzen, musst du bei dir in "Eigene Dateien" gehen, und dort den Link von dem Dateinamen kopieren, der in der Liste angezeigt wird....

Und sonst... du solltest überlegen, welche Klassen du brauchst. Und welche Eigenschaften (Fields) und Methoden diese Klassen haben müssen. I.a. versucht man das Spiel selbst und das GUI zu trennen, aber das wäre jetzt ein bißchen Overkillig.

Im Moment ist deine Haupt-"verwaltungs"-Klasse wohl "SpielStart". Welche Aufgaben sie genau übernimmt, ist aber nicht so klar. Sowas wie
int zufallszahl = starteSpiel.getBilder(zufall);
sieht eben ... unverständlich aus - man kann erstmal nicht verstehen, was dort passiert. Wenn man ein Spiel hat, sollte das "Spiel" heißen. Aber "starteSpiel" ist etwas, was man TUT - also eine Methode. Man ruft dort also "starteSpiel.getBilder" auf, und übergibt eine Zufallszahl. Aber 'getBilder' liefert nicht etw Bilder (wie der Name suggeriert) sondern eine andere(!?) zufallszahl. Hm.

Mal der Reihe nach:

Du hast also ein Panel, das den Koffer anzeigt, und nacheinander eine bestimmte Menge von Bildern, jeweils 2 Sekunden lang. Dann hast du ein Panel, in dem ALLE Möglichen Gegenstände abgebildet sind, und wo man nacheinander die Bilder anklicken muss, die im Koffer angezeigt wurden. Die "Hauptklasse" (bei dir wohl der Frame) bestimmt, wann ein Spiel startet und endet, und die verifiziert, dass die richtigen Bilder angeklickt wurden.

Wenn man jetzt überlegt, welche Aufgaben dort erfüllt werden müssen, bekommt man schon ein grobes "Skelett" von Klassen mit den Methoden, die sie anbieten müssen. Der Ablauf eines Spieles wäre ja dann...
- Man wählt den Menüeintrag (oder Button) "Neues Spiel"
- Zuerst wird das Spiel initialisiert. Man kopiert eine zufällige Auswahl von Bildern in eine Liste. Diese Bilder müssen dann im Koffer angezeigt, und danach vom User mit den Buttons ausgewählt werden.
- Dann wird diese Liste an den Koffer übergeben, der sie nacheinander anzeigt.
- Wenn er fertig ist, wird abgewartet, welche Buttons der Spieler klickt. Wenn das angeklickte Bild in der Liste enthalten ist, wird es entfernt. Wenn es NICHT enthalten ist, hat man verloren.
- Wenn die Liste leer ist (d.h. wenn alle Bilder richtig angeklickt wurden) hat man gewonnen.

Nochmal ein bißchen code...
Code:
class Spiel
{
    private List<Image> listeAllerBilder = ...
    private List<Image> aktuelleListe = ...

    private KofferPanel kofferPanel = siehe oben....

    public Spiel()
    {
         // Lade ALLE Bilder die vorkommen können, und speichere sie
         // in der listeAllerBilder
         ... 
         // Erstelle die Buttons mit den Bildern, die der Benutzer dann anklicken muss (siehe weiter unten)
         erstelleButtons();
    }


    // Muss aufgerufen werden, wenn man "Neues Spiel" auswählt.
    public void neuesSpiel()
    {
         int anzahlDerBilderDieInDenKofferSollen = 5; // Wie viele das auch immer sein sollen
         aktuelleListe.clear();

         // Fülle so lange zufällig ausgewählte Bilder in die aktuelleListe, bis sie die gewünschte
         // Anzahl bilder enthält. (Das ist NICHT sauber implementiert, nur zur Verdeutlichung!!!)
         while (aktuelleListe.size() < anzahlDerBilderDieInDenKofferSollen)
         {
              int bildNummer = (int)(Math.random()*listeAllerBilder.size());
              Image bild = listeAllerBilder.get(bildNummer);
              aktuelleListe.add(bild);
         }

         // Sag' dem KofferPanel, dass es alle Bilder aus der aktuelleListe anzeigen soll:
         for (Image bild : aktuelleListe)
         {
             kofferPanel.addImageToShow(bild); // (Siehe KofferPanel oben im Thread)
         }
          
         // Starte den Thread, der nacheinander die Bilder im Kofferpanel anzeigt
         kofferPanel.startGame();
    }


    private void erstelleButtons()
    {
         int anzahlAllerBilder = listeAllerBilder.size();
         dasPanelWoDieButtonsReinkommen.removeAll();
         dasPanelWoDieButtonsReinkommen.setLayout(new GridLayout(1, anzahlAllerBilder ));  
         for (int i=0; i<anzahlAllerBilder; i++)
         {
              Image bild = listeAllerBilder.get(i);
              JButton button = new JButton(...imageIcon mit dem bild...);
              dasPanelWoDieButtonsReinkommen.add(button);
              final int nummer = i;
              button.addActionListener(new ActionListener()
              { 
                   public void actionPerformed(ActionEvent e)
                   {
                        bildButtonWurdeAngeklickt(nummer);
                   }
              });
          }
    }


    // Wird aufgerufen, wenn einer der Bild-Buttons angeklickt wurde
    // Die Übergebene nummer ist der Index des Bildes in der listeAllerBilder
    private void bildButtonWurdeAngeklickt(int nummer)
    {
         Image angeklicktesBild = listeAllerBilder.get(nummer);
         if (!aktuelleListe.contains(angeklicktesBild))
         {
              System.out.println("Das Bild Nummer "+nummer+" war nicht im Koffer! Du hast verloren!");
         }
         else
         {
              System.out.println("Ja, Bild nummer "+nummer+" war im Koffer!");
              aktuelleListe.remove(angeklicktesBild);
              
              if (aktuelleListe.size() == 0)
              {
                  System.out.println("Du hast alle Bilder ankeglickt. Gewonnen!");
              }
              else
              {
                  System.out.println("Du musst noch "+aktuelleListe.size()+" Bilder anklicken!");
               }
          }
    }

Naja. So in etwa...
 

dörte

Mitglied
:applaus: :applaus: :applaus:

ich muss jetzt mal arbeiten gehen (die gastro ruft), aber ich glaube...
das ist der wahnsinn, werd morgen um 6 uhr aufstehen und den code ausprobieren.
dank dir schon mal! auf bald...
 

dörte

Mitglied
so hi!

zuerst mal mein neuer code: codes

ich habe jetzt versucht ihn anzupassen und zu erweitern. aber ich bekomme runtime exceptions.
außerdem reden wir glaube ich ein wenig aneinander vorbei. ???:L
eigentlich soll das spiel so ablaufen, dass das spiel das erste bild anzeigt, auf den benutzer wartet, bei richtig das erste und das zweite anzeigt, auf die benutzereingabe waretet, bei richtig, das erste, zweite und dritte anzeigt, wartet...usw.

es funktioniert zwar noch nicht, aber ich glaube in deinem code ist das noch nicht so vorgesehen, oder?!

ich habe mal die codestellen mit großbuchstaben kommentiert, an denen ich nicht weiterkomme und hoffe du kannst mir helfen.

außerdem habe ich immer noch das problem, dass ich nicht weiß, wo im code, ich was hinsetzen soll. in netbeans kann man ja die klassen anlegen, indem man auf das package klickt und neue klasse anwählt. doch dann bekomme ich meist probleme mit swingvariablen. netbeans kennt diese einfach nicht. bis jetzt siehts so aus, dass ich die Spiel - klasse in die GameFrame - klasse reinschmeiße. dann klappts auch die swingvariablen anzusprechen. allerdings ist mir das system dahinter nicht ganz klar, da die KofferPanel - Klasse ja nicht mit in das KofferPanel schmeiße. also wo soll ich was hinsetzen?

schaus dir doch mal an, bitte. wenn du lieber die gesamte netbeans - datei haben möchtest, kann ich die auch auf meinen webspace hochladen.

mir kommts so vor als wäre ich kurz vor der lösung, aber es hängt noch an gewissen stellen.
trotzdem nochmal die code-fetzen:
GameFrame und Spiel:

Code:
public class GameFrame extends javax.swing.JFrame {
    
    /** Creates new form GameFrame */
    public GameFrame() {
        initComponents();
        Spiel spiel = new Spiel();
    }
   
/**
 *
 * @author Max
 */
public class Spiel {
    // das array für die gesamten bilder
    private ArrayList<Image> listeAllerBilder = new ArrayList<Image>();
    // umwandeln der bilder in ein image - objekt
    private Image tastatur = Toolkit.getDefaultToolkit().createImage("/img/appleTastatur.jpg");
    private Image mightyMouse = Toolkit.getDefaultToolkit().createImage("/img/mightyMouse.jpg");
    // WIE SCHAFFE ICH ES DIE BILDER INS ARRAY ZU KRIEGEN? edit: habe jetzt unter neuesSpiel() versucht die bilder hinzuzufügen, kriege aber trotzdem keine anzeige der bilder,
// nachdem ich auf Spiel Starten im menü geklickt habe
    private ArrayList<Image> aktuelleListe = new ArrayList<Image>();
    // instanzierung des KofferPanels
    private KofferPanel kofferPanel = new KofferPanel();
    
    public Spiel(){
        // lade alle bilder, die vorkommen können und speichere sie in dem array listeAllerBilder
        kofferPanel.starteSpiel();// STIMMT DAS SO?
        // erstelle die buttons mit den bildern, die der benutzer anklicken muss
        erstelleButtons();
        
    }
    // muss aufgerufen werden, wenn der benutzer neues spiel wählt
    public void neuesSpiel(){
        listeAllerBilder.add(tastatur);
        listeAllerBilder.add(mightyMouse);
        int bilderDieInDenKofferSollen = 2;
        aktuelleListe.clear();
        // fülle so lange zufällig bilder in die liste bis die gewünschte anzahl erreicht ist
        while (aktuelleListe.size() < bilderDieInDenKofferSollen){
            int bildnummer = (int) (Math.random()*listeAllerBilder.size());
            Image bild = listeAllerBilder.get(bildnummer);
            aktuelleListe.add(bild);
        }
        // dem kofferPanel sagen, dass es alle bilder aus der aktuellen list anzeigen soll
        for (Image bild: aktuelleListe){
            kofferPanel.addBilder(bild);
        }
        // starte den thread, der nacheinander die bilder im kofferpanel anzeigt
        kofferPanel.starteSpiel();
    }
    private void erstelleButtons(){
        int anzahlAllerBilder = listeAllerBilder.size();
        jPanelButtons.removeAll();
        jPanelButtons.setLayout(new GridLayout(1, anzahlAllerBilder));
        
        for (int i=0; i<anzahlAllerBilder; i++){
            Image bild = listeAllerBilder.get(i);
            JButton button = new JButton(); //VERLANGT NACH ICON, WIE KRIEGE ICH DIE BILDER AUF DEN BUTTON?
            
            jPanelButtons.add(button);
            final int nummer = i;
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    bildButtonWurdeAngeklickt(nummer);
                }
                
            });
            
            
        }
        
    }
    // wird aufgerufen, wenn einer der bild-buttons angeklickt wurde
    // die übergebene nummer ist index des bildes in der listeAlleBilder
    private void bildButtonWurdeAngeklickt(int nummer){
        Image angeklicktesBild = listeAllerBilder.get(nummer);
        if (!aktuelleListe.contains(angeklicktesBild)){
            jLabelInfoText.setText("Leider falsch! GameOver! Probiers doch nochmal!?!");
        }else{
            jLabelInfoText.setText("Vollkommen richtig!");
            aktuelleListe.remove(angeklicktesBild);
            if (aktuelleListe.size() == 0){
                jLabelInfoText.setText("Super! Du bist schlauer als Waldi!");
            }
        }
        
    }
}
private void jMenuItemStartMouseReleased(java.awt.event.MouseEvent evt) {                                             
// IST DAS SO RICHTIG?
        Spiel spiel = new Spiel();
        spiel.neuesSpiel();
    }
 public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GameFrame().setVisible(true);
                
            }
        });
    }
und die KofferPanel - klasse:

Code:
import java.awt.Graphics;
import java.awt.Image;
import java.util.*;
/**
 *
 * @author Max
 */
public class KofferPanel {
    
    private ArrayList<Image> anzuzeigendeBilder = new ArrayList<Image>();
    private Image aktuellesBild = null;
    
    
    public void addBilder(Image bild){
        anzuzeigendeBilder.add(bild);
    }
    public void starteSpiel() {
        Thread t = new Thread(new Runnable() {
            public void run() {
                for (int i=0; i<anzuzeigendeBilder.size(); i++){
                    aktuellesBild = anzuzeigendeBilder.get(i);
                    try {
                   
                        
                        Thread.sleep(2000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
                aktuellesBild = null;
                
            }
        });
        t.start();
    }
}
 

Marco13

Top Contributor
Jo, ich seh' schon, das endet im Chaos. Verabschiede dich von dem Gedanken, dass man "Programmieren" kann, indem man irgendwelche GUI-Element zusammenklickt. (Was zur Hölle IST eigentlich ActionScript? Mit Programmierung scheint das ja nicht sooo viel zu tun zu haben....) However. Hier ist mal alles zusammengewurstet in eine Datei. Die meisten GUI-Sachen mußte ich rausschmeißen, weil ich kein NetBeans verwende, und die ganzen layout-Sachen, die der GUI-Builder da einbar, eben NetBeans-Spezifisch sind (einer der Hauptgründe, warum man das IMHO nicht verwenden sollte....). Aber man kann zumindest ein Spiel starten, und es Läuft dann so ab, wie du beschrieben hast:
1. Runde: 1 Bild erscheint 2 Sekunden lang, danach drückt man den passenden Button
2. Runde: 2 Bilder erscheinen Je 2 Sekunden lang, danach drückt man die passenden Buttons
... usw

Es ist jetzt halt schon häßlich und unaufgeräumt, aber ... tja, es läuft halt erstmal....
Code:
/*
 * GameFrame.java
 *
 * Created on 17. Januar 2008, 09:06
 */

//package PackeDeinenKoffer;

import java.util.*;
import java.awt.Image;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.*;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.*;
import java.io.File;
import java.util.*;
import javax.imageio.ImageIO;
import javax.swing.JButton;
/**
 *
 * @author  Max ... naja - wie man's nimmt....
 */

class KofferPanel extends JPanel
{
    private Image kofferImage;
    private ArrayList<Image> imagesToShow = new ArrayList<Image>();

    private Image currentImage = null;

    private int currentX;
    private int currentY;

    public KofferPanel()
    {
        kofferImage = new javax.swing.ImageIcon(getClass().getResource("/img/koffer.gif")).getImage();
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(kofferImage, 0,0,this);
        if (currentImage != null)
        {
            g.drawImage(currentImage, currentX, currentY, this);
        }
    }

    public void addImageToShow(Image image)
    {
         imagesToShow.add(image);
    }

    public void clearImagesToShow()
    {
		imagesToShow.clear();
		currentImage = null;
	}

    public void startSlideshow()
    {
        Thread t = new Thread(new Runnable()
        {
            public void run()
            {
				//System.out.println("imagesToShow "+imagesToShow.size());
                for (int i=0; i<imagesToShow.size(); i++)
                {
                    currentX = (int)(Math.random() * (kofferImage.getWidth(KofferPanel.this) - 100));
                    currentY = (int)(Math.random() * (kofferImage.getHeight(KofferPanel.this) - 100));
                    currentImage = imagesToShow.get(i);

					//System.out.println("currentImage "+currentImage+" at "+currentX+" "+currentY);


                    repaint();

                    try { Thread.sleep(2000); } catch (Exception e) {}
                }
                currentImage = null;
                repaint();
            }
         });
         t.start();
	 }


}


public class GameFrame extends javax.swing.JFrame {

    /** Creates new form GameFrame */
    public GameFrame()
    {
        initComponents();

        // lade alle bilder, die vorkommen kšnnen und speichere sie in dem array listeAllerBilder
	    listeAllerBilder.add(new javax.swing.ImageIcon(getClass().getResource("/img/appleKeyboard.jpg")).getImage());
	    listeAllerBilder.add(new javax.swing.ImageIcon(getClass().getResource("/img/mightyMouse.jpg")).getImage());

        // erstelle die buttons mit den bildern, die der benutzer anklicken muss
        erstelleButtons();

    }

	JPanel jPanelButtons;

    // das array fŸr die gesamten bilder
    private ArrayList<Image> listeAllerBilder = new ArrayList<Image>();

    private ArrayList<Image> aktuelleListe = new ArrayList<Image>();
    // instanzierung des KofferPanels
    private KofferPanel kofferPanel = new KofferPanel();

	private boolean rundeZuende = false;
	private boolean gewonnen = false;

    // muss aufgerufen werden, wenn der benutzer neues spiel wŠhlt
    public void neuesSpiel()
    {

		Thread gameThread = new Thread(new Runnable()
		{
			public void run()
			{
                int bilderDieInDenKofferSollen = 1;
				while (true)
				{
					rundeZuende = false;
                    jLabelInfoText.setText("Runde mit "+bilderDieInDenKofferSollen+" bildern");
					kofferPanel.clearImagesToShow();
        			aktuelleListe.clear();
        			// fŸlle so lange zufŠllig bilder in die liste bis die gewŸnschte anzahl erreicht ist
        			while (aktuelleListe.size() < bilderDieInDenKofferSollen){
        			    int bildnummer = (int) (Math.random()*listeAllerBilder.size());
        			    Image bild = listeAllerBilder.get(bildnummer);
        			    aktuelleListe.add(bild);
        			}
        			// dem kofferPanel sagen, dass es alle bilder aus der aktuellen list anzeigen soll
        			for (Image bild: aktuelleListe){
        			    kofferPanel.addImageToShow(bild);
        			}

			        // starte den thread, der nacheinander die bilder im kofferpanel anzeigt
			        kofferPanel.startSlideshow();

					// Warte auf benutzereingaben (in bildButtonWurdeAngeklickt)
			        while (!rundeZuende)
			        {
						synchronized(GameFrame.this)
						{
							try
							{
								wait();
							} catch (Exception e) {}
						}
					}
					if (!gewonnen)
					{
						break;
					}
					bilderDieInDenKofferSollen++;
				}
			}
		});
		gameThread.start();

    }


    private void erstelleButtons(){
        int anzahlAllerBilder = listeAllerBilder.size();
        jPanelButtons.removeAll();
        jPanelButtons.setLayout(new GridLayout(1, anzahlAllerBilder));

        for (int i=0; i<anzahlAllerBilder; i++){
            Image bild = listeAllerBilder.get(i);
            JButton button = new JButton(new javax.swing.ImageIcon(bild));
			button.setPreferredSize(new Dimension(bild.getWidth(this), bild.getHeight(this)));
            jPanelButtons.add(button);
            final int nummer = i;
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    bildButtonWurdeAngeklickt(nummer);
                }

            });


        }

    }
    // wird aufgerufen, wenn einer der bild-buttons angeklickt wurde
    // die Ÿbergebene nummer ist index des bildes in der listeAlleBilder
    private void bildButtonWurdeAngeklickt(int nummer){
        Image angeklicktesBild = listeAllerBilder.get(nummer);
        if (!aktuelleListe.contains(angeklicktesBild)){
            jLabelInfoText.setText("Leider falsch! GameOver! Probiers doch nochmal!?!");
            rundeZuende = true;
            gewonnen = false;
            synchronized(this) { notify(); }// Dem gameThread sagen, dass es weitergeht....
        }else{
            jLabelInfoText.setText("Vollkommen richtig!");
            aktuelleListe.remove(angeklicktesBild);
            if (aktuelleListe.size() == 0){
                jLabelInfoText.setText("Super! Du bist schlauer als Waldi!");
	            rundeZuende = true;
	            gewonnen = true;
	            synchronized(this) { notify(); }// Dem gameThread sagen, dass es weitergeht....
            }
        }

    }

    JLabel jLabelInfoText;


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Erzeugter Quelltext ">//GEN-BEGIN:initComponents
    private void initComponents()
    {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		getContentPane().setLayout(new BorderLayout());

		getContentPane().add(kofferPanel, BorderLayout.CENTER);

		jPanelButtons = new JPanel();
		getContentPane().add(jPanelButtons, BorderLayout.SOUTH);

		JPanel rechtesPanel = createRechtesPanel();
		getContentPane().add(rechtesPanel, BorderLayout.EAST);

		jLabelInfoText = new JLabel("Info...");
		getContentPane().add(jLabelInfoText, BorderLayout.NORTH);


		//------- menu stuff

    javax.swing.JMenuBar jMenuBar;
    javax.swing.JMenu jMenuHilfe;
    javax.swing.JMenuItem jMenuItemAnleitung;
    javax.swing.JMenuItem jMenuItemBeenden;
    javax.swing.JMenuItem jMenuItemStart;
    javax.swing.JMenuItem jMenuItemUeber;
    javax.swing.JMenu jMenuSpiel;

        jMenuBar = new javax.swing.JMenuBar();
        jMenuSpiel = new javax.swing.JMenu();
        jMenuItemStart = new javax.swing.JMenuItem();
        jMenuItemBeenden = new javax.swing.JMenuItem();
        jMenuHilfe = new javax.swing.JMenu();
        jMenuItemAnleitung = new javax.swing.JMenuItem();
        jMenuItemUeber = new javax.swing.JMenuItem();

        jMenuSpiel.setText("Spiel");
        jMenuItemStart.setText("Spiel Starten");
        jMenuItemStart.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemStartMouseReleased();
            }
        });

        jMenuSpiel.add(jMenuItemStart);

        jMenuItemBeenden.setText("Quit");
        jMenuSpiel.add(jMenuItemBeenden);

        jMenuBar.add(jMenuSpiel);

        jMenuHilfe.setText("Hilfe");
        jMenuItemAnleitung.setText("Anleitung");
        jMenuHilfe.add(jMenuItemAnleitung);

        jMenuItemUeber.setText("\u00dcber das Spiel");
        jMenuHilfe.add(jMenuItemUeber);

        jMenuBar.add(jMenuHilfe);

        setJMenuBar(jMenuBar);

        //........................


		setSize(800,600);

    }// </editor-fold>//GEN-END:initComponents

    private void jMenuItemStartMouseReleased() {//GEN-FIRST:event_jMenuItemStartMouseReleased
        System.out.println("Hallo");
        neuesSpiel();
    }//GEN-LAST:event_jMenuItemStartMouseReleased

    private void jLabelTastMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabelTastMouseReleased

    }//GEN-LAST:event_jLabelTastMouseReleased


    private void jMenuSpielMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jMenuSpielMousePressed

    }//GEN-LAST:event_jMenuSpielMousePressed



	private JPanel createRechtesPanel()
	{
		JPanel panel = new JPanel();
		panel.add(new JLabel("Gestapelte koffer usw..."));
		return panel;
	}



    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GameFrame().setVisible(true);

            }
        });
    }


}
 

dörte

Mitglied
hi,

ein bißchen code
Code:
  private JFrame erzeugeAnleitungsFrame(){
        
        JFrame  anleitung = new JFrame();
        anleitung.setSize(new Dimension(400,300));
        anleitung.setVisible(true);
        
        JTextField textfeld = new JTextField();
        textfeld.setText("Anleitung blblblb");// Wieso sehe ich keinen Text?
        textfeld.setForeground(Color.black);
        anleitung.getContentPane().setBackground(Color.red);
        anleitung.getContentPane().setLayout(new BorderLayout());
        anleitung.getContentPane().add(textfeld, BorderLayout.CENTER);
        return anleitung;
    }
warum krieg ich hier nur einen roten frame? und der text erscheint nicht?
Code:
private JPanel createRechtesPanel() {
        
        JPanel panel = new JPanel();
        
        panel.setBackground(Color.darkGray);
        panel.setForeground(Color.white);
        Image hintergrundbild = new ImageIcon("/img/jobsSitzend.jpg").getImage();
        
       
        JLabel begriffeTitel = new JLabel();
        
        begriffeTitel.setText("Anzahl der gemerkten Bilder");
        
        JLabel begriffeAnzahl = new JLabel();
        begriffeAnzahl.setForeground(Color.white);
        begriffeAnzahl.setText("0");
        
        JLabel scoreTitel = new JLabel();
        scoreTitel.setText("Highscore");
        
        JLabel highscore = new JLabel();
        highscore.setText("0");
        
        
        
        panel.add(begriffeTitel);
        panel.add(begriffeAnzahl);
        panel.add(scoreTitel);
        panel.add(highscore);
        return panel;
    }

wie schaffe ich es, dass das rechtePanel http://www.java-forum.org/de/userfiles/user12496/rechtespanel.jpg so aussieht? das wäre mir nochmals ein große hilfe, hab das schon mal mit paintComponent probiert bekomme aber fehlermeldungen.
zusätzlich: was muss ich tun, damit sich die bilder sich nicht jedesmal wechseln, wenn ich sie anzeigen lasse? also, dass das erste bild bis zum gewinn des spiels auch das erste bleibt, ebenso beim zweiten, dritten usw.
Vielen Dank!
Code:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Ich habe das Gefühl etwas grundlegendes falsch zu machen Java Basics - Anfänger-Themen 6
V Grundlegendes Zu Objekten/Klassen Java Basics - Anfänger-Themen 10
G OOP-Frage - Grundlegendes zum erzeugen von Klassen Java Basics - Anfänger-Themen 7
K Grundlegendes Problem - Editor funktioniert nicht Java Basics - Anfänger-Themen 9
J SWING UI Designer und zeichnen Java Basics - Anfänger-Themen 4
G Maven Swing: Wie verwende ich WindowListener ? Java Basics - Anfänger-Themen 2
C Threads und Swing Java Basics - Anfänger-Themen 9
A Swing: Raumshiff Java Basics - Anfänger-Themen 3
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
nbergmann Wo ist javax.swing.JOptionPane gespeichert? Java Basics - Anfänger-Themen 4
StevenGG Java swing "New Integer" Java Basics - Anfänger-Themen 5
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
O ImageIcon, Swing Java Basics - Anfänger-Themen 1
O Swing JPanel Java Basics - Anfänger-Themen 4
F Swing - Fehler - Paint Methode Java Basics - Anfänger-Themen 7
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
M Wie kann ich hier ein Textfeld hinzufügen Java Swing? Java Basics - Anfänger-Themen 1
M SpielMenü mit Swing Java Basics - Anfänger-Themen 3
M Wie kann ich eine Eingabe im Java-Swing übergeben? Java Basics - Anfänger-Themen 1
N javax swing JOptionPane Hilfe Java Basics - Anfänger-Themen 3
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
C Der Swing Layout-Manager hasst mich Java Basics - Anfänger-Themen 4
M Java swing im Browser starten Java Basics - Anfänger-Themen 0
M JavaFX in Swing-Applikationen einbetten Java Basics - Anfänger-Themen 5
Z Threads SWING mit EventQueue.invokeLater Java Basics - Anfänger-Themen 1
P JDK installieren javac behauptet Javax.swing existiert nicht Java Basics - Anfänger-Themen 8
K Ascii Converter mit Swing Java Basics - Anfänger-Themen 4
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
N Erste Schritte Karte in SWING Application Java Basics - Anfänger-Themen 4
D Mehrfacherfassung in Swing GUI Java Basics - Anfänger-Themen 12
D Datum aus Swing in MySQL DB speichern Java Basics - Anfänger-Themen 22
R warum kann System.out.println(..) etwas, was Swing-Elemente Nicht können ? Java Basics - Anfänger-Themen 11
J Input/Output Charset Swing- Eingaben? Java Basics - Anfänger-Themen 8
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
B Swing intstalliert Eclips{}, mackiert Rot Java Basics - Anfänger-Themen 6
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
B Java Swing "Zeichenfläche" Java Basics - Anfänger-Themen 1
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Platzieren von Komponenten in Swing Applet funktioniert nicht Java Basics - Anfänger-Themen 3
P Hintergrundbild in Swing einfügen Java Basics - Anfänger-Themen 3
C Swing frage Java Basics - Anfänger-Themen 8
T Rechenprogramm mit Swing Java Basics - Anfänger-Themen 3
K Swing Darstellungsproblem Java Basics - Anfänger-Themen 11
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
P Swing - Blackscreen Java Basics - Anfänger-Themen 10
Y Random-Objekt und Swing Java Basics - Anfänger-Themen 4
M Klassen Hilfe bei SWING Java Basics - Anfänger-Themen 5
S GUI Problem: Swing Java Basics - Anfänger-Themen 8
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
B Erste Schritte Primefaces -> Swing Gui Java Basics - Anfänger-Themen 7
T Swing, SWT oder JavaFX Java Basics - Anfänger-Themen 8
S Programmoberfläche mit Java-Swing - Herangehensweise Java Basics - Anfänger-Themen 20
E Fragen zu paintXXX in Swing Java Basics - Anfänger-Themen 7
D Erste Schritte bash-Befehl mit Swing ausführen Java Basics - Anfänger-Themen 8
A Alternative zum manuellen Swing programmieren?? Java Basics - Anfänger-Themen 4
S Android fuer Swing-Kenner..? Java Basics - Anfänger-Themen 6
J Swing Timer Java Basics - Anfänger-Themen 3
B Seltsamer Fehler in SWING anwendung Java Basics - Anfänger-Themen 2
D GPS Tracker Swing Java Basics - Anfänger-Themen 2
L Erste Schritte Swing oder SWT Paint mit Grafikkarte? Java Basics - Anfänger-Themen 7
B Einstieg in swing GUI Java Basics - Anfänger-Themen 7
S Swing Eingabe Erzwingen Java Basics - Anfänger-Themen 3
S Swing JTable Java Basics - Anfänger-Themen 7
Z Input/Output Programm mit Swing umsetzen Java Basics - Anfänger-Themen 6
K Eclipse wie Swing per Drag und Drop erstellen Java Basics - Anfänger-Themen 2
V Dropdown Button in einer GUI (Java Swing) Java Basics - Anfänger-Themen 12
S Swing, Gridbaglayout Panel in Panel;funzt nicht!! Java Basics - Anfänger-Themen 3
O swing komponenten werden nicht angezeigt Java Basics - Anfänger-Themen 6
S Swing, Panel über Hintergrundbild!! Java Basics - Anfänger-Themen 6
P Im Fenster bleiben (swing) Java Basics - Anfänger-Themen 16
M Einfacher Swing Wizard Java Basics - Anfänger-Themen 3
E Swing FileWrite?? Java Basics - Anfänger-Themen 3
S Umlaute in Swing-GUI Java Basics - Anfänger-Themen 8
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
M Swing Klasse auch per Kommandozeile starten? Java Basics - Anfänger-Themen 2
S JAVA Swing Eventlistener Java Basics - Anfänger-Themen 11
P Swing - Welche Klasse für ausgeben von Ergebnissen? Java Basics - Anfänger-Themen 3
V Swing Componenten werden auf Mac nicht angezeigt Java Basics - Anfänger-Themen 19
J Überfordert mit Swing Java Basics - Anfänger-Themen 5
B Baum > Baum-Swing Java Basics - Anfänger-Themen 4
B Bei Swing weg vom North-West-South-East-Prinzip Java Basics - Anfänger-Themen 2
K Swing Fenster jede sec.neuzeichnen Java Basics - Anfänger-Themen 14
F Werteübergabe in Swing Formularen (gui Builder) Java Basics - Anfänger-Themen 9
L Swing GridBagLayout Java Basics - Anfänger-Themen 3
K Bild als Hintergrund in einem Swing Fenster Java Basics - Anfänger-Themen 21
J unterschied zwischen awt und swing Java Basics - Anfänger-Themen 6
C Swing i.V.m. Threads Java Basics - Anfänger-Themen 2
J XML Viewer for Swing Java Basics - Anfänger-Themen 6
Y Anfänger Hausaufgabe... Swing Java Basics - Anfänger-Themen 6
W Zeichnen in Swing Java Basics - Anfänger-Themen 7
G Swing Applikation mit mehreren Klassen Java Basics - Anfänger-Themen 2
C Swing, Buttons Wert zuweisen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben