# ActionListener von eigener ButtonKlasse



## Oliver530 (31. Mai 2012)

Hi zuammen,

ich bin gerade dabei mein erstes "vernünftiges"  Java-Programm zu schreiben (Mini-Projekt für die Hochschule - Minesweeper hab ich mir ausgesucht). ich habe eine eigene Buttonklasse eingeführt, um den "Zustand" der Buttons zu speichern (Button == Mine, Button hat genau 1 Mine um sich, ...)
Mein ActionListener macht jedoch Probleme und ich komm nicht weiter...
Ich glaube mal gehört zu haben, dass man für jeden Button einen eigenen ActionListener anmelden soll, was in meinem Fall aber ziemlich viele werden dürften. Stimmt das?
Vielleicht könnt ihr mir ja etwas weiterhelfen. 

"myActionListener cannot be resolved to a variable" meckert übrigens der Compiler in der 56. Zeile:

```
grid[x][y].addActionListener(myActionListener);
```

Vielen Dank schonmal für eure Hilfe! 


```
import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.*;


public class MinesweeperGUI extends JFrame{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private final int gridSpalten = 9;
	private final int gridZeilen = 9;
	private final int maxMinen = 10;
	
	private int verbleibendeMinen = maxMinen;
	private int verstricheneZeit = 0;
	
	
	JButtonZustand [] [] grid = new JButtonZustand[gridSpalten] [gridZeilen];

	
	private JTextField minenAnzeige = new JTextField(3);
	private JTextField zeitAnzeige = new JTextField(3);
	private JButton startButton = new JButton();
	
	public MinesweeperGUI() {
		
		super("MineSweeper v1.0");
		setSize(400, 500);
		setLayout(new BorderLayout());
				
		
		JPanel panelAnzeige = new JPanel();
		minenAnzeige.setEditable(false);
		minenAnzeige.setText(Integer.toString(verbleibendeMinen));
		zeitAnzeige.setEditable(false);
		zeitAnzeige.setText(Integer.toString(verstricheneZeit));
		panelAnzeige.setLayout(new FlowLayout());
		panelAnzeige.add(minenAnzeige);
		panelAnzeige.add(startButton);
		panelAnzeige.add(zeitAnzeige);
		add(panelAnzeige, BorderLayout.PAGE_START);
		
		// Grid mit Buttons erstellen
		JPanel panelGrid = new JPanel();
		panelGrid.setLayout(new GridLayout(gridSpalten, gridZeilen));
		for (int y = 0; y < grid.length; y++) {
			for (int x = 0; x < grid[y].length; x++) {
				
				grid[x][y] = new JButtonZustand ("(" + x + "," + y + ")");
				grid[x][y].addActionListener(myActionListener);
				panelGrid.add(grid[x][y]);
				
			}
		}
		add(panelGrid, BorderLayout.CENTER);
		

		
		
		
		minenLegen();
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
	}
	
	private void minenLegen() {
		
		int gelegteMinen = 0;
		
		while (gelegteMinen < maxMinen) {
			
			int zufallszahlX = (int) ( Math.random() * gridSpalten);
			int zufallszahlY = (int) ( Math.random() * gridZeilen);
			
			// Mine legen, wenn dort noch keine liegt
			if ( grid[zufallszahlX] [zufallszahlY].getZustand() != 9) {				
				System.out.println("Gefärbt!");
				grid[zufallszahlX] [zufallszahlY].setText("BOMBE!");
				grid[zufallszahlX] [zufallszahlY].setZustand(9);
				gelegteMinen++;
			}
		}
		
	}

	class myActionListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			
			System.out.println("Event ausgelöst");
			for (int y = 0; y < grid.length; y++) {
				for (int x = 0; x < grid[y].length; x++) {
				if ( e.getSource() == grid[x][y] ) {
					
					if ( grid[x][y].getZustand() == 9 ) {
						System.out.println("BOMBE!!!");
					} else {
						System.out.println("FAIL");
					}
					
				}
				}
			}

			
			
		}

	}
	
}
```

Eigene Button-Klasse:


```
import javax.swing.*;


public class JButtonZustand extends JButton {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	int zustand = 10;
	
	public JButtonZustand(String text) {
		super(text);
		zustand = 10;
	}
	
	public int getZustand() {
		return zustand;
	}
	
	public void setZustand(int zustand) {
		this.zustand = zustand;
	}

}
```


----------



## CortPoker (31. Mai 2012)

```
grid[x][y].addActionListener(myActionListener);
```
 muss 
	
	
	
	





```
grid[x][y].addActionListener(new myActionListener());
```
 lauten, da du dort keine Klasse, sondern eine Instanz der Klasse übergeben möchtest.
Prinzipiell übergibst du so jedem Button einen eigenen Listener

[EDIT]@SlaterB: Jop, das hat man davon, wenn man zu schnell auf abschicken klickt [/EDIT]


----------



## SlaterB (31. Mai 2012)

Klassen schreibt man groß und


```
panelAnzeige.setLayout(FlowLayout);
```
statt

```
panelAnzeige.setLayout(new FlowLayout());
```
wäre ein ähnlicher Fehler


@CortPoker 
auch nicht ganz korrekte Syntax   edit: inzwischen editiert, anonyme Klasse muss nicht sein, ist schon fertig



eine Variable anzulegen und wiederholt zuzuweisen wäre durchaus angebracht, dazu sähe der Code auch gut aus,
denn Variablen schreibt man klein


----------



## Oliver530 (31. Mai 2012)

Herzlichen Dank! Jetzt kann ich wunderbar alle ActionEvents zuordnen.


----------



## Oliver530 (31. Mai 2012)

Eine kleine Abschlussfrage noch:
Das grobe Gerüst steht. Ich sehe jedoch keine Möglichkeit, an welcher Stelle ich jetzt meine Neustart-Funktion einfügen kann (Neues Spiel starten, ...). Das Programm begibt sich ja in irgend eine "Schleife", da ich bei gewonnenen Spiel unendlich oft die Benachrichtigung bekomme, dass ich gewonnen habe.
Vielleicht könnt ihr mir ja weiterhelfen! 

MinesweeperGUI-Klasse

```
import javax.swing.*;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.*;
 
 
public class MinesweeperGUI extends JFrame{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    // Kann später evtl noch manuell eingestellt werden
    private static final int gridSpalten = 9;
    private static final int gridZeilen = 9;
    private final int maxMinen = 10;
        
    public static int felderAufgedeckt = 0;

    // Wird links oben angezeigt
    private int verbleibendeMinen = maxMinen;
    private int verstricheneZeit = 0;
    
    // In diesem 2D-Array werden die speziellen JButtons gespeichert
    public static JButtonZustand [] [] grid = new JButtonZustand[gridSpalten] [gridZeilen];
 
    // Oberes Bedienfeld
    private JTextField minenAnzeige = new JTextField(3);
    private JTextField zeitAnzeige = new JTextField(3);
    private JButton startButton = new JButton("Neu");
    
    // Konstruktor der GUI
    public MinesweeperGUI() {
        
        super("MineSweeper v1.0");
        setSize(400, 500);
        setLocation(150, 150);
        setLayout(new BorderLayout());
        
        // Panel für die obere Anzeige (Verbleibende Minen, Start, Zeit)
        JPanel panelAnzeige = new JPanel();
        minenAnzeige.setEditable(false);
        minenAnzeige.setText(Integer.toString(verbleibendeMinen));
        zeitAnzeige.setEditable(false);
        zeitAnzeige.setText(Integer.toString(verstricheneZeit));
        panelAnzeige.setLayout(new FlowLayout());
        panelAnzeige.add(minenAnzeige);
        panelAnzeige.add(startButton);
        startButton.addActionListener(new StartActionListener());
        panelAnzeige.add(zeitAnzeige);
        add(panelAnzeige, BorderLayout.PAGE_START);
        
        // Grid mit Buttons erstellen
        JPanel panelGrid = new JPanel();
        panelGrid.setLayout(new GridLayout(gridSpalten, gridZeilen));
        for (int y = 0; y < grid.length; y++) {
            for (int x = 0; x < grid[y].length; x++) {
                
                grid[x][y] = new JButtonZustand ("?", x, y);
                grid[x][y].addActionListener(new MyActionListener());
                grid[x][y].addMouseListener(new MyListener());
                panelGrid.add(grid[x][y]);
                
            }
        }
        add(panelGrid, BorderLayout.CENTER);
        
        
        // Zufällig Minen in das Koordinatensystem legen
        minenLegen();
        
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
    }
    
    
    // Methode legt zufällig Minen ins Koordinatensystem
    private void minenLegen() {
        
        int gelegteMinen = 0;
        while (gelegteMinen < maxMinen) {
            
            int zufallszahlX = (int) ( Math.random() * gridSpalten);
            int zufallszahlY = (int) ( Math.random() * gridZeilen);
            
            // Mine legen, wenn dort noch keine Mine liegt
            if ( grid[zufallszahlX] [zufallszahlY].getZustand() != 9) {             
                grid[zufallszahlX] [zufallszahlY].setZustand(9);
                gelegteMinen++;
            }
        } 
    }

    // Methode um festzustellen, ob das Spiel gewonnen wurde
    private void spielGewonnen() {
    	
    	if ( felderAufgedeckt == gridSpalten * gridZeilen ) {
    		JOptionPane.showMessageDialog(null, "Glückwunsch! Sie haben gewonnen!");
    		
    	}
    	
    }
    

    // Action listener für die linke Maustaste (später evtl zusammenfassen?)
    class MyActionListener implements ActionListener {
 
        @Override
        public void actionPerformed(ActionEvent e) {
            
            for (int y = 0; y < grid.length; y++) {
                for (int x = 0; x < grid[y].length; x++) {
                	
                if ( e.getSource() == grid[x][y] ) {
                    
                    if ( grid[x][y].getZustand() != 9 ) {
                    	grid[x][y].minenSuche(grid);
                    } else {
                    	JOptionPane.showMessageDialog(null, "Bombe getroffen! Sie haben leider verloren!");
                        System.exit(1);
                    }       
                }
        		spielGewonnen();
                }
            }
 
        }
    }
    
    class StartActionListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			
			if (e.getActionCommand() == "Neu") {
				System.out.println("Neues Spiel!");
			}
			
		}
    	
    }
    
    // Noch implementieren:  nach 10 rechtsklciks stopp
    class MyListener extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {
        	
        	for (int y = 0; y < grid.length; y++) {
                for (int x = 0; x < grid[y].length; x++) {
                	if ( (e.getSource() == grid[x][y]) && SwingUtilities.isRightMouseButton(e) ) {
                		grid[x][y].setText("X");
                		grid[x][y].setFont(new Font("Dialog", 0, 50));
                		grid[x][y].setBackground(new Color(255, 0, 0)); 
                		grid[x][y].setForeground(new Color(255, 0, 0));                 		
                		verbleibendeMinen--;
                		minenAnzeige.setText(Integer.toString(verbleibendeMinen));
                		                		
                		spielGewonnen();
                	}
                }
            }
        }
    }
    
}
```

JButtonZustand-Klasse:

```
import java.awt.Font;

import javax.swing.*;


public class JButtonZustand extends JButton {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int zustand;
	private int x;
	private int y;
	
	public JButtonZustand(String text, int x, int y) {
		super(text);
		this.x = x;
		this.y = y;
		zustand = 10;
	}
	
	public int getterX() {
		return x;
	}
	
	public int getterY() {
		return this.y;
	}
	
	public int getZustand() {
		return zustand;
	}

	
	public void setZustand(int zustand) {
		
		if (zustand != 9 && zustand != 0) {
			this.zustand = zustand;
			setText(Integer.toString(zustand));
			setFont(new Font("Dialog", 0, 50));
			setEnabled(false);
		} else if ( zustand == 0 ) {
			this.zustand = zustand;
			setText("");
			setFont(new Font("Dialog", 0, 20));
			setEnabled(false);
		} else {
			this.zustand = zustand;
		}
		MinesweeperGUI.felderAufgedeckt++;

	}
	
	
	public void minenSuche(JButtonZustand [] [] grid) {
		int anzahlMinen = 0;
		try {
			if ( grid[x-1][y].getZustand() == 9 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x-1][y-1].getZustand() == 9 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x][y-1].getZustand() == 9 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y-1].getZustand() == 9 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y].getZustand() == 9 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y+1].getZustand() == 9 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x][y+1].getZustand() == 9 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x-1][y+1].getZustand() == 9 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		
		if ( anzahlMinen != 0 && grid[x][y].getZustand() == 10) {
			setZustand(anzahlMinen);
		} else {
			setZustand(0);
			try {
				if ( grid[x-1][y].getZustand() == 10) {
					grid[x-1][y].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x-1][y-1].getZustand() == 10 ) {
					grid[x-1][y-1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x][y-1].getZustand() == 10 ) {
					grid[x][y-1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x+1][y-1].getZustand() == 10 ) {
					grid[x+1][y-1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x+1][y].getZustand() == 10 ) {
					grid[x+1][y].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x+1][y+1].getZustand() == 10 ) {
					grid[x+1][y+1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x][y+1].getZustand() == 10 ) {
					grid[x][y+1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x-1][y+1].getZustand() == 10 ) {
					grid[x-1][y+1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}

		}
		
	}
	

	
}
```

Main-Klasse:

```
public class Main {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
			MinesweeperGUI game1 = new MinesweeperGUI();
		
		
	}

}
```

Vielen Dank!


----------



## Blackhole16 (1. Jun 2012)

ich mach das meistens so, dass ich das, was in de rmain steht in eine Funktion packe, die ich dann aufrufe. Somit öffnet sich ein komplett neues fenster. Das alte musst du natürlich schließen, davor wäre am einfachsten 

mfg
BH16


----------



## Oliver530 (1. Jun 2012)

Ok, hab's mal umgeschrieben, aber wie kann ich mein aktuelles Fenster ansprechen um es zu schließen, wenn ein Neues Spiel gestartet werden soll?
this. und game1. funktionieren nicht. Muss ich dem Konstruktor noch einen Namen irgendwie zuweisen (ich dacht er heißt game1)?
Schließe ich das Fenster mit setVisible(false) oder ist das eine unschöne Variante, weil das Fenster ja nicht richtig gelöscht wird?


```
public class Main {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		starteSpiel();		
	}
	
	public static void starteSpiel() {
		MinesweeperGUI game1 = new MinesweeperGUI();
    	game1.minenLegen();
		    	
    }
}
```

MinesweeperGUI-Klasse:

```
import javax.swing.*;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.*;
 
 
public class MinesweeperGUI extends JFrame{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    // Kann später evtl noch manuell eingestellt werden
    private static final int gridSpalten = 9;
    private static final int gridZeilen = 9;
    private final static int maxMinen = 10;
        
    public int felderAufgedeckt = 0;

    // Wird links oben angezeigt
    private int verbleibendeMinen = maxMinen;
    private int verstricheneZeit = 0;
    
    // In diesem 2D-Array werden die speziellen JButtons gespeichert
    public JButtonZustand [] [] grid = new JButtonZustand[gridSpalten] [gridZeilen];
 
    // Oberes Bedienfeld
    private JTextField minenAnzeige = new JTextField(3);
    private JTextField zeitAnzeige = new JTextField(3);
    private JButton startButton = new JButton("Neu");
    
    // Konstruktor der GUI
    public MinesweeperGUI() {
        
        super("MineSweeper v1.0");
        setSize(400, 500);
        setLocation(150, 150);
        setLayout(new BorderLayout());
        
        // Panel für die obere Anzeige (Verbleibende Minen, Start, Zeit)
        JPanel panelAnzeige = new JPanel();
        minenAnzeige.setEditable(false);
        minenAnzeige.setText(Integer.toString(verbleibendeMinen));
        zeitAnzeige.setEditable(false);
        zeitAnzeige.setText(Integer.toString(verstricheneZeit));
        panelAnzeige.setLayout(new FlowLayout());
        panelAnzeige.add(minenAnzeige);
        panelAnzeige.add(startButton);
        startButton.addActionListener(new StartActionListener());
        panelAnzeige.add(zeitAnzeige);
        add(panelAnzeige, BorderLayout.PAGE_START);
        
        // Grid mit Buttons erstellen
        JPanel panelGrid = new JPanel();
        panelGrid.setLayout(new GridLayout(gridSpalten, gridZeilen));
        for (int y = 0; y < grid.length; y++) {
            for (int x = 0; x < grid[y].length; x++) {
                
                grid[x][y] = new JButtonZustand ("?", x, y);
                grid[x][y].addActionListener(new MyActionListener());
                grid[x][y].addMouseListener(new MyListener());
                panelGrid.add(grid[x][y]);
                
            }
        }
        add(panelGrid, BorderLayout.CENTER);
        
       
        
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
    }
    
    
    // Methode legt zufällig Minen ins Koordinatensystem
    public void minenLegen() {
        
        int gelegteMinen = 0;
        while (gelegteMinen < maxMinen) {
            
            int zufallszahlX = (int) ( Math.random() * gridSpalten);
            int zufallszahlY = (int) ( Math.random() * gridZeilen);
            
            // Mine legen, wenn dort noch keine Mine liegt
            if ( grid[zufallszahlX] [zufallszahlY].getZustand() != 9) {             
                grid[zufallszahlX] [zufallszahlY].setZustand(9);
                gelegteMinen++;
            }
        } 
    }

    // Methode um festzustellen, ob das Spiel gewonnen wurde
    private void spielGewonnen() {
    	
    	if ( felderAufgedeckt == gridSpalten * gridZeilen ) {
    		JOptionPane.showMessageDialog(null, "Glückwunsch! Sie haben gewonnen!");
    		
    	}
    	
    }
    
    

    // Action listener für die linke Maustaste (später evtl zusammenfassen?)
    class MyActionListener implements ActionListener {
 
        @Override
        public void actionPerformed(ActionEvent e) {
            
            for (int y = 0; y < grid.length; y++) {
                for (int x = 0; x < grid[y].length; x++) {
                	
                if ( e.getSource() == grid[x][y] ) {
                    
                    if ( grid[x][y].getZustand() != 9 ) {
                    	grid[x][y].minenSuche(grid);
                    } else {
                    	JOptionPane.showMessageDialog(null, "Bombe getroffen! Sie haben leider verloren!");
                        // System.exit(1);
                    }       
                }
        		//spielGewonnen();
                }
            }
 
        }
    }
    
    class StartActionListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			
			if (e.getActionCommand() == "Neu") {
				Main.starteSpiel();
			}
			
		}
    	
    }
    
    // Noch implementieren:  nach 10 rechtsklciks stopp
    class MyListener extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {
        	
        	for (int y = 0; y < grid.length; y++) {
                for (int x = 0; x < grid[y].length; x++) {
                	if ( (e.getSource() == grid[x][y]) && SwingUtilities.isRightMouseButton(e) ) {
                		System.out.println( grid[x][y].getZustand() );

                		// Flagge auf Mine
                		if ( grid[x][y].getZustand() == 9 ) {
	                		grid[x][y].setZustand(12);
                			verbleibendeMinen--;
	                		minenAnzeige.setText(Integer.toString(verbleibendeMinen));
	                	// Flagge auf nicht Mine
                		} else if ( grid[x][y].getZustand() == 10 ) {
	                		grid[x][y].setZustand(11);
                			verbleibendeMinen--;
	                		minenAnzeige.setText(Integer.toString(verbleibendeMinen));
	                	// Flagge zurücksetzen von Mine
                		} else if ( grid[x][y].getZustand() == 12 ){
	                		grid[x][y].setZustand(9);
	                		// Explizit wieder auf '?' stellen
	                		grid[x][y].setText("?");
	                		grid[x][y].setFont(new Font("Dialog", 0, 25));
	                		grid[x][y].setBackground(new Color(0, 0, 0)); 
	                		grid[x][y].setForeground(new Color(0, 0, 0));
                			verbleibendeMinen++;
	                		minenAnzeige.setText(Integer.toString(verbleibendeMinen));
	                	// Flagge zurücksetzen von Nicht-Mine
                		} else if ( grid[x][y].getZustand() == 11 ){
	                		grid[x][y].setZustand(10);
                			verbleibendeMinen++;
	                		minenAnzeige.setText(Integer.toString(verbleibendeMinen));
                		} 
                		
                		System.out.println( grid[x][y].getZustand() );

                		                		
                		//spielGewonnen();
                	}
                }
            }
        }
    }
    
}
```


----------



## Blackhole16 (1. Jun 2012)

```
du definierst dein game1 einfach nur in der starteSpiel methode, du musst ihn der ganzen klasse zur verfügung stelllen. this sollte in MidesweeperGUI.java gehen, in Main.java natürlich nicht, weil sie nichts erbt. Also:
public class Main {
    private MinesweeperGUI game1;
    /**
     * @param args
     */
    public static void main(String[] args) {
        starteSpiel();      
    }
    
    public static void starteSpiel() {
        game1 = new MinesweeperGUI();
        game1.minenLegen();
                
    }
}
```
und später dann einfach


```
game1.dispose();
game1 = new MinesweeperGUI();
game1.minenLegen();
```

noch ein paar empfehlungen:
[c]setSize(400, 500);[/c] und [c]setLocation(150, 150);[/c] sollten wenn dann an das Ende vom Konstruktor, besser noch in die main, also extern aufrufen. Also 

```
setSize(400, 500);
setLocation(150, 150);
//...
setVisible(true);
```
aus dem konstruktor löschen und in die mein rein:


```
public static void main(String[] args) {
    MinesweeperGUI game1 = new MinesweeperGUI();
    game1.minenLegen();
    game1.setSize(400, 500);
    game1.setLocation(150, 150);
    game1.setVisible(true);
}
```
starteSpiel auch raus, das machst du (jetzt) ja in der main, oder nicht? 

Und noch ein genereller tip: setVisible(true) immer als letztes aufrufen, auch wenn du danach nur setdefaultcloseoperation aufrufst. (in diesem falle ´kein unterschied, sieht einfasch nur besser aus  )

Und gleich noch etwas: anstatt setSize und setLocation mach einfach setBounds, das macht das ganze Programm eine Zeile kürzer 

Zu deiner anderen Frage: ich glaube, dass der Java gc klug genug ist auch setVisible(false) zu löschen, aber dispose ist immer besser.

Den rest habe ich mir jetzt nicht angeschaut, wenn noch fragen auftreten einfach fragen. Und wenn du fertig bist, erkläre mir mal bitte, wie du alle Felder aufdeckst, wenn ein leeres angeklickt wird, daran grüble ich schon ne lange weile, hatte aber aucch noch keine Lust mich ganz genau damit auseinanderzusetzen und habs deswegen auf die lange Bank geschoben  (PN, wenn du möchtest)

mfg
BH16

PS: Alle Rechtschreibfehler sind gewollt gemacht worden, um zu zeigen, wie man es nicht macht :lol:


----------



## Oliver530 (1. Jun 2012)

Herzlichen Dank für deine Hilfe! Du hast mir sehr geholfen! :toll: :applaus:

Die starteSpiel()-methode kommt auch in die Main-Klasse oder? Der Compiler beschwert sich jedoch, dass 
	
	
	
	





```
private MinesweeperGUI game1;
```
 nicht static sei, wenn ich es aber auf static ändere, gibt's Probleme beim Start eines neuen Spiels. Wenn ich die Methode jedoch auf static stelle, komme ich von der MinesweeperGUI nicht mehr rein... Hab ich was übersehen? :noe:

Vielen Dank auch für deine formalen Tipps! Die sind super! 

PS: Die AufdeckMethode schick ich dir später per PM!


----------



## Oliver530 (1. Jun 2012)

Hat sich erledigt! 


```
private static MinesweeperGUI game1;
```


```
public static void starteSpiel() {
		
		game1.dispose();
		game1 = new MinesweeperGUI();
		game1.minenLegen();
		game1.setSize(400, 500);
	    game1.setLocation(150, 150);
	    game1.setVisible(true);

    }
```


```
if (e.getActionCommand() == "Neu") {
				Main.starteSpiel();
			}
```

Jetzt läuft's wunderbar! 
Ode rhab ichs nur hingepfuscht? 

PS:
Ich würde den Zahlen auf den Buttons gern verschiedene Farben geben, wie beim Original. Klappt auch wunderbar, aber sobald ich den Button setEnabled(false) setze (wichtig, da man ihn nichtmehr drücken darf). Werden alle Farben verworfen und das Standard-Grau wird drauf geschrieben.
Gibt's da 'ne Lösung?


----------



## Blackhole16 (1. Jun 2012)

wenn dir das so wichtig ist, kannst du einfach setBackground(Color col= auf grau setzen und es enabled lassen, in der ActionPerformed aber überprüfen, ob es schon gedrückt wurde und dann einfach nicht mehr reagieren, z.B. mit boolean[][].

hast du das verstanden? Ich bin nämlich noch nicht richtig wach, gerade erst auffgestanden 

mfg
BH16


----------



## Vancold (2. Jun 2012)

Hey!

Ich geb dir einen Tipp.

Du hast für deine Minesweeper Felder, für den Startbutton und den Mouselistener (welcher auch auf die Minesweeper Felder bezogen ist) einen Listener.

Wenn du schon einen eigenen Listener schreibst für die Felder warum fragst du dann ab welches Feld das ist?

Du weißt das es ein Feld ist
caste doch einfach =)

sag einfach das deine Quelle in dem Fall schon ein Feld ist!

Und deine funktionen in JButtonZustand sind teilweise zu umständlich. würdest du casten müsstest du nicht alles durchlaufen lassen ^^


lg

Rene


----------



## Oliver530 (3. Jun 2012)

Danke für deine Antwort! 

mir ist bewusst, dass bei jedem Mausklick (rechts & links) der Mouselistener angesprochen wird. Eigentlich wollte ich deshalb die beiden Listener zusammenlegen und nur den Mouselistener verwenden. Aber dann funktioniert meine .doClick()-Methode in der JButtonZustand-Klasse nicht mehr. 
Gibt es eine vergleichbare Methode, die ich mit der Mouselistener-Methode stattdessen verwenden könnte?

Und vielen Dank für deinen Casting-Tipp. ich versteh aber leider noch nicht ganz, wie ich dann abfrage, welcher Button (x, y) gedrückt wurde. (Sorry, bin noch Anfänger :rtfm:  )

Gefühlt, mache ich doch schon große Fortschritte. 
Aber ein ungutes Gefühl, habe ich noch in meiner Main-Methode. Irgendwie läuft mir zu viel über die gespeicherten Objekt-Referenzen

```
public static MinesweeperGUI game1;
    public static Startbildschirm start1;
```
. Oder ist das so in Ordnung? Außerdem bin ich mir noch nicht ganz sicher mit meiner static-Wahl. Sind die static-Attribute/Methoden wirklich richtig gesetzt und auch notwendig?

Ich poste mal noch meinen aktuellen Code:

MinesweeperGUI-Klasse:

```
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.*;
 
 
public class MinesweeperGUI extends JFrame{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
            
    // Kann später evtl noch manuell eingestellt werden
    private int gridSpalten;
    private int gridZeilen;
    private int maxMinen;
    
    private int delay = 1000; //milliseconds
    private boolean firstKlick = true;
    
    private JHighscore highscore1;
    private static boolean loeschen = true;
    
    public void setNeueGroesse(int gridSpalten, int gridZeilen, int maxMinen) {
    	this.gridSpalten = gridSpalten;
    	this.gridZeilen = gridZeilen;
    	this.maxMinen = maxMinen;

    }
    
    // wird benötigt, um Sieg zu ermitteln
    private int felderAufgedeckt = 0;
    
    public void resetFelderAufgedeckt() {
    	felderAufgedeckt = 0;
    }
    
    public void upFelderAufgedeckt() {
    	felderAufgedeckt++;
    }

    // Wird links oben angezeigt
    private int verbleibendeMinen;
    private int verstricheneZeit = 0;
    private static int highscore = 9999;
    private boolean boolVerloren = false;
    
    // In diesem 2D-Array werden die speziellen JButtons gespeichert
    public JButtonZustand [] [] grid;
    public int [] [] gridMinen;
 
    // Oberes Bedienfeld
    private JTextField minenAnzeige = new JTextField(3);
    private JTextField zeitAnzeige = new JTextField(3);
    private JButton startButton = new JButton("Neues Spiel");
    
    // Unteres Bedienfeld
    private JButton tastaturButton = new JButton("Tastaturbelegung");
    private JButton anleitungButton = new JButton("Anleitung");
    
    private JPanel panelGesamt = new JPanel();
    private JTabbedPane tabGame = new JTabbedPane();

    // Konstruktor der GUI
    public MinesweeperGUI(int gridSpalten, int gridZeilen, int maxMinen) {
        
        super("MineSweeper v3.0");
        // Neue Einstellungen für's Spiel laden
        this.gridSpalten = gridSpalten;
        this.gridZeilen = gridZeilen;
        this.maxMinen = maxMinen;
        verbleibendeMinen = maxMinen;
        
        // Array-Speicher für JButtons und Minen initialisieren
        grid = new JButtonZustand[gridSpalten] [gridZeilen];
        gridMinen = new int[gridSpalten] [gridZeilen];
        
        
        
        
        // Layout der MinesweeperGUI festlegen
        panelGesamt.setLayout(new BorderLayout());
        
        // Panel für die obere Anzeige (Verbleibende Minen, Start, Zeit)
        JPanel panelAnzeige = new JPanel();
        minenAnzeige.setEditable(false);
        minenAnzeige.setText(Integer.toString(verbleibendeMinen));
        zeitAnzeige.setEditable(false);
        zeitAnzeige.setText(Integer.toString(verstricheneZeit));
        panelAnzeige.setLayout(new FlowLayout());
        panelAnzeige.add(minenAnzeige);
        panelAnzeige.add(startButton);
        startButton.addActionListener(new StartActionListener());
        panelAnzeige.add(zeitAnzeige);
        panelAnzeige.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
        panelGesamt.add(panelAnzeige, BorderLayout.PAGE_START);
        
        // Grid mit Buttons erstellen
        JPanel panelGrid = new JPanel();
        panelGrid.setLayout(new GridLayout(this.gridSpalten, this.gridZeilen));
        for (int y = 0; y < grid.length; y++) {
            for (int x = 0; x < grid[y].length; x++) {
                
                grid[x][y] = new JButtonZustand ("?", x, y);
                grid[x][y].addActionListener(new MyActionListener());
                grid[x][y].addMouseListener(new MyListener());
                panelGrid.add(grid[x][y]);
                
            }
        }
        panelGrid.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
        panelGrid.setBackground(Color.WHITE);
        panelGesamt.add(panelGrid, BorderLayout.CENTER);
        
        
        // Untere Buttons
        JPanel panelInfo = new JPanel();
        anleitungButton.addActionListener(new StartActionListener());
        tastaturButton.addActionListener(new StartActionListener());
        panelInfo.add(tastaturButton);
        panelInfo.add(anleitungButton);
        panelInfo.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
        panelGesamt.add(panelInfo, BorderLayout.PAGE_END);
        
        tabGame.addTab("Game", panelGesamt);
        tabGame.addTab("Optionen", Main.start1);
        highscore1 = new JHighscore();
        tabGame.addTab("Highscore", highscore1);

        add(tabGame);
     // Register a change listener
//        tabGame.addChangeListener(new ChangeListener() {
//            // This method is called whenever the selected tab changes
//            
//
//			@Override
//			public void stateChanged(ChangeEvent evt) {
//				JTabbedPane tabGame = (JTabbedPane)evt.getSource();
//
//				//if ( (tabGame.getSelectedIndex() == 2)  ) {
//					highscore1 = new JHighscore();
//				//}
//				
//			}
//        });
     
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
    }
    
    
    
    
    // Methode legt zufällig Minen ins Koordinatensystem
    public void minenLegen() {
    	        
        int gelegteMinen = 0;
        while (gelegteMinen < maxMinen) {
            
            int zufallszahlX = (int) ( Math.random() * this.gridSpalten);
            int zufallszahlY = (int) ( Math.random() * this.gridZeilen);
                    
            // Mine legen, wenn dort noch keine Mine liegt
            if ( grid[zufallszahlX] [zufallszahlY].getZustand() != 9) {             
                grid[zufallszahlX] [zufallszahlY].setZustand(9);
                // Zufallsminen in Array abspeichern
                gridMinen[zufallszahlX][zufallszahlY] = 1;
                gelegteMinen++;
            }
        } 
    }

    // Methode um festzustellen, ob das Spiel gewonnen wurde
    private void spielGewonnen() {
    	
    	if ( felderAufgedeckt == this.gridSpalten * this.gridZeilen ) {
    	    timer1.stop();
    	    
    	    // Highscore festlegen
    	    if ( verstricheneZeit < highscore ) {
    	    	highscore = verstricheneZeit;
    	    	String name = JOptionPane.showInputDialog("Glückwunsch! Sie haben einen neuen Highscore erreicht! Bitte geben Sie ihren Namen ein: ");
    	    	JHighscore.highscoreEintragen(name, highscore);
//    	    	highscore1 = new JHighscore();
    	    }
    	    
    		JOptionPane.showMessageDialog(null, "Glückwunsch! Sie haben gewonnen!\n\n" +
    				"Ihre Zeit: " + verstricheneZeit + "\nHighscore: " + highscore);
    	}
    }
    
    private void spielVerloren() {
	    timer1.stop();
    	JOptionPane.showMessageDialog(null, "Bombe getroffen! Sie haben leider verloren!");
        boolVerloren = true;
    	// Minenarray öffnen und alle Minen anzeigen
    	
    	for (int i = 0; i < gridMinen.length; i++) {
            for (int j = 0; j < gridMinen[i].length; j++) {
            	if ( gridMinen[i][j] == 1 ) {
            		grid[i][j].setColour();
            	} else {
                	grid[i][j].setEnabled(false);
            	}

            }
    	}
    }
    
    
    // Methode, die bei linksKlick aufgerufen wird
    private void linksKlick(int x , int y) {
    	
    	if ( firstKlick ) {
    	    timer1.start();
    	}
    	firstKlick = false;
    	
    	// läuft das aktuelle Spiel noch?
        if ( !boolVerloren ) {
            
            if ( grid[x][y].getZustand() > 8 ) {

            	if ( grid[x][y].getZustand() == 10 ) {
            		grid[x][y].minenSuche(grid);
		        } else if ( grid[x][y].getZustand() == 9 ) {
		            spielVerloren();
		        }    
		                
            // Wenn der Zustand des Feldes, mit den gesetzten anliegenden Flaggen übereinstimmt,
		    // werden die Nachbarfelder aufgedeckt	=> Quick-Open
            } else if ( grid[x][y].getZustand() < 9 && !JButtonZustand.getBooleanStopp()) {
                if ( grid[x][y].getZustand() == grid[x][y].flaggenSuche(grid) ) {
                	grid[x][y].rundOeffnen(grid);
                }
            }
        }
    }
    
    private void rechtsKlick(int x, int y) {
    	
    	// Flagge auf Mine
		if (( grid[x][y].getZustand() == 9 ) && (verbleibendeMinen > 0)) {
    		grid[x][y].setZustand(12);
			verbleibendeMinen--;
    		minenAnzeige.setText(Integer.toString(verbleibendeMinen));

    	// Flagge auf nicht Mine
		} else if (( grid[x][y].getZustand() == 10 ) && (verbleibendeMinen > 0)) {
    		grid[x][y].setZustand(11);
			verbleibendeMinen--;
    		minenAnzeige.setText(Integer.toString(verbleibendeMinen));

    	// Flagge zurücksetzen von Mine
		} else if ( grid[x][y].getZustand() == 12 ){
    		grid[x][y].setZustand(9);
    		// Explizit wieder auf '?' stellen
    		grid[x][y].setForeground(new Color(0, 0, 0));
    		grid[x][y].setText("?");
    		grid[x][y].setFont(new java.awt.Font("Comic Sans MS",0, 20));
    		felderAufgedeckt--;
			verbleibendeMinen++;
    		minenAnzeige.setText(Integer.toString(verbleibendeMinen));

    	// Flagge zurücksetzen von Nicht-Mine
		} else if ( grid[x][y].getZustand() == 11 ){
    		felderAufgedeckt--;
    		felderAufgedeckt--;
    		grid[x][y].setZustand(10);
			verbleibendeMinen++;
    		minenAnzeige.setText(Integer.toString(verbleibendeMinen));

		} 

    }
    	
 

    // Action listener für die linke Maustaste (später evtl zusammenfassen?)
    class MyActionListener implements ActionListener {
 
        @Override
        public void actionPerformed(ActionEvent e) {
        	
        	// herausfinden, welcher Button gedrückt wurde
	        for (int y = 0; y < grid.length; y++) {
	            for (int x = 0; x < grid[y].length; x++) {
	
	            	if ( e.getSource() == grid[x][y] ) {
	            		linksKlick(x, y);
	            	}
	            }
	        }
	        
        }
    }
    
    
    class MyListener extends MouseAdapter {

        @Override
        public void mouseClicked(MouseEvent e) {

        	// herausfinden, welcher Button gedrückt wurde
	        for (int y = 0; y < grid.length; y++) {
	            for (int x = 0; x < grid[y].length; x++) {
	
	            	if ( (e.getSource() == grid[x][y]) && SwingUtilities.isRightMouseButton(e) ) {
	            		rechtsKlick(x, y);
	            	}
	            }
	        }
	        // Überprüft nach jedem Klick ob das Spiel gewonnen wurde
        	spielGewonnen();
        }
    }
    
    // ActionListener für sonstige Button
    // leitet neues Spiel ein
    class StartActionListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			
			if (e.getActionCommand() == "Neues Spiel") {
				Main.starteSpielNeu();
			} else if (e.getActionCommand() == "Anleitung") {
				anleitungAnzeigen();
			} else if (e.getActionCommand() == "Tastaturbelegung") {
				tastaturAnzeigen();
			}
			
		}
    }
    
    public void anleitungAnzeigen() {
    	String text = "Anleitung\n\nDas Ziel von Minesweeper besteht darin, " +
    			"möglichst schnell alle Minen zu finden,\n" +
    			"ohne eine Mine aufzudecken.\n\n" +
    			"Der Spielbereich besteht aus einem Spielfeld, einem Minenzähler und einer Uhr.\n\n" +
    			"Du kannst Quadrate aufdecken, indem du darauf klickst.\n" +
    			"Wenn das aufgedeckte Quadrat vermint ist, hast du das Spiel verloren.\n" +
    			"Wenn das Quadrat nicht vermint ist, erscheint eine Zahl, die die Anzahl von Minen " +
    			"in den benachbarten acht Quadraten angibt.\n" +
    			"Um ein Quadrat zu markieren, von dem du annimmst, " +
    			"dass es eine Mine enthält, klicke mit der rechten Maustaste darauf.";
    	JOptionPane.showMessageDialog(null, text);
    }
    
    public void tastaturAnzeigen() {
    	String text = "Linke Maustaste:     Feld aufdecken\n" +
    					"Rechte Maustaste:   Minenflagge setzen / Minenflagge ersetzen";
    	JOptionPane.showMessageDialog(null, text);
    }
    
    ActionListener taskPerformer = new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
        	verstricheneZeit++;
            zeitAnzeige.setText( Integer.toString(verstricheneZeit) );
        }
    };
    Timer timer1 = new Timer(delay, taskPerformer);


    
}
```

JButtonZustand-Klasse:

```
import java.awt.Color;

import javax.swing.*;


public class JButtonZustand extends JButton {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private int zustand = 10;
	/* Es gibt folgende Zustände:
	 * Zustand 0 	=> Das Feld besitzt 0 Nachbarminen
	 * Zustand 1-8	=> Das Feld besitzt x Nachbarminen
	 * Zustand 9	=> Eine Mine liegt auf dem Feld
	 * Zustand 10	=> Für den Spieler noch unbekanntes Feld (darunter "schlummert" Zustand 0-9)
	 * Zustand 11	=> Es liegt eine Flagge auf einem falschen Feld
	 * Zustand 12	=> Es liegt eine Flagge auf einem Minenfeld
	 * Zustand 13	=> Feld wird neu erstellt  ??? noch offen
	 */
	
	private static boolean booleanStopp = false;
	
	public static boolean getBooleanStopp() {
		return booleanStopp;
	}
	
	// Koordinaten
	private int x;
	private int y;
	
	// Button-Konstruktor, inkl. Koordinaten- und Zustandsattribut (default = 10)
	public JButtonZustand(String text, int x, int y) {
		super(text);
		setColour();
		this.x = x;
		this.y = y;
	}
	
	public int getterX() {
		return x;
	}
	
	public int getterY() {
		return this.y;
	}
	
	// öffentliche Methode um den aktuellen Zustand des Objekts abzufragen
	public int getZustand() {
		return zustand;
	}
	
	// Methode, die für Farben, Schriftart und Schriftgröße sorgt
	public void setColour() {
		
		setFont(new java.awt.Font("Arial Black",1, 21));
		if ( zustand == 1 ) {
			// setBackground(new Color(0, 0, 255)); 
    		setForeground(new Color(0, 0, 255));
		} else if ( zustand == 2 ) {
    		setForeground(new Color(0, 205, 102));
		} else if ( zustand == 3 ) {
    		setForeground(new Color(238, 44, 44));
		} else if ( zustand == 4 ) {
    		setForeground(new Color(85, 26, 139));
		} else if ( zustand == 5 ) {
    		setForeground(new Color(139, 0, 0));
		} else if ( zustand == 6 ) {
    		setForeground(new Color(0, 191, 255));
		} else if ( zustand == 7 ) {
    		setForeground(new Color(147, 112, 219));
		} else if ( zustand == 8 ) {
    		setForeground(new Color(54, 54, 54));
	    // Symbol für Aufdeckung nach verlorenen Spiel
		} else if ( zustand == 10 ) {
    		setForeground(new Color(0, 0, 0));
    		setText("?");
    		setFont(new java.awt.Font("Comic Sans MS",0, 20));
		} else if ( zustand == 11 || zustand == 12 || zustand == 9 ) {
			setText("X");
			setFont(new java.awt.Font("Arial Black",1, 25));
    		setForeground(new Color(205, 85, 85));
		}
	}
	
	// Methode, die den Zustand der Buttons ändert und alle nötigen Vorkehrungen trifft
	public void setZustand(int zustand) {
		
		// Zustand 0
		if ( zustand == 0 ) {
			this.zustand = zustand;
			setText("");
			setEnabled(false);
			Main.game1.upFelderAufgedeckt();
		// Zustand 1 - 8
		} else if (zustand > 0 && zustand < 9) {
			this.zustand = zustand;
			setText(Integer.toString(zustand));
			setColour();
			Main.game1.upFelderAufgedeckt();
		// Zustand 9
		} else if ( zustand == 9 ) {
			this.zustand = zustand;
		// Zustand 10
		} else if ( zustand == 10 ) {
			this.zustand = zustand;
			setColour();
			Main.game1.upFelderAufgedeckt();
	  		// Zustand 11
		} else if ( zustand == 11) {
			this.zustand = zustand;
			setColour();
			Main.game1.upFelderAufgedeckt();
    	// Zustand 12
		} else if ( zustand == 12 ) {
			this.zustand = zustand;
			setColour();
			Main.game1.upFelderAufgedeckt();
		}

	}
	
	// Sucht alle umliegenden Nachbarn ab, ob Minen darunter liegen
	public void minenSuche(JButtonZustand [] [] grid) {
		int anzahlMinen = 0;
		try {
			if ( grid[x-1][y].getZustand() == 9 || grid[x-1][y].getZustand() == 12) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x-1][y-1].getZustand() == 9 || grid[x-1][y-1].getZustand() == 12 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x][y-1].getZustand() == 9 || grid[x][y-1].getZustand() == 12) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y-1].getZustand() == 9 || grid[x+1][y-1].getZustand() == 12 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y].getZustand() == 9 || grid[x+1][y].getZustand() == 12 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y+1].getZustand() == 9 || grid[x+1][y+1].getZustand() == 12 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x][y+1].getZustand() == 9 || grid[x][y+1].getZustand() == 12 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x-1][y+1].getZustand() == 9 || grid[x-1][y+1].getZustand() == 12 ) {
				anzahlMinen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		
		// Suche abgeschlossen
		if ( anzahlMinen != 0 && grid[x][y].getZustand() == 10) {
			setZustand(anzahlMinen);
		} else {
			// Aufdeck-Algorithmus
			setZustand(0);
			try {
				if ( grid[x-1][y].getZustand() == 10) {
					grid[x-1][y].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x-1][y-1].getZustand() == 10 ) {
					grid[x-1][y-1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x][y-1].getZustand() == 10 ) {
					grid[x][y-1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x+1][y-1].getZustand() == 10 ) {
					grid[x+1][y-1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x+1][y].getZustand() == 10 ) {
					grid[x+1][y].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x+1][y+1].getZustand() == 10 ) {
					grid[x+1][y+1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x][y+1].getZustand() == 10 ) {
					grid[x][y+1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}
			try {
				if ( grid[x-1][y+1].getZustand() == 10 ) {
					grid[x-1][y+1].doClick();
				}
			} catch (ArrayIndexOutOfBoundsException e) {}

		}
	}
	
	// sucht wieviele Nachbarflaggen ein Feld besitzt
	public int flaggenSuche(JButtonZustand [] [] grid) {
		int anzahlFlaggen = 0;
		try {
			if ( grid[x-1][y].getZustand() == 11 || grid[x-1][y].getZustand() == 12) {
				anzahlFlaggen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x-1][y-1].getZustand() == 11 || grid[x-1][y-1].getZustand() == 12 ) {
				anzahlFlaggen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x][y-1].getZustand() == 11 || grid[x][y-1].getZustand() == 12) {
				anzahlFlaggen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y-1].getZustand() == 11 || grid[x+1][y-1].getZustand() == 12 ) {
				anzahlFlaggen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y].getZustand() == 11 || grid[x+1][y].getZustand() == 12 ) {
				anzahlFlaggen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y+1].getZustand() == 11 || grid[x+1][y+1].getZustand() == 12 ) {
				anzahlFlaggen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x][y+1].getZustand() == 11 || grid[x][y+1].getZustand() == 12 ) {
				anzahlFlaggen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x-1][y+1].getZustand() == 11 || grid[x-1][y+1].getZustand() == 12 ) {
				anzahlFlaggen++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		
		return anzahlFlaggen;
		
	}
	
	public void rundOeffnen(JButtonZustand [] [] grid) {
		
		try {
			if ( grid[x-1][y].getZustand() == 10 || grid[x-1][y].getZustand() == 9 ) {
				grid[x-1][y].doClick();
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x-1][y-1].getZustand() == 10 || grid[x-1][y-1].getZustand() == 9 ) {
				grid[x-1][y-1].doClick();
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x][y-1].getZustand() == 10 || grid[x][y-1].getZustand() == 9 ) {
				grid[x][y-1].doClick();
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y-1].getZustand() == 10 || grid[x+1][y-1].getZustand() == 9 ) {
				grid[x+1][y-1].doClick();
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y].getZustand() == 10 || grid[x+1][y].getZustand() == 9 ) {
				grid[x+1][y].doClick();
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x+1][y+1].getZustand() == 10 || grid[x+1][y+1].getZustand() == 9 ) {
				grid[x+1][y+1].doClick();
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x][y+1].getZustand() == 10 || grid[x][y+1].getZustand() == 9 ) {
				grid[x][y+1].doClick();
			}
		} catch (ArrayIndexOutOfBoundsException e) {}
		try {
			if ( grid[x-1][y+1].getZustand() == 10 || grid[x-1][y+1].getZustand() == 9 ) {
				grid[x-1][y+1].doClick();
			}
		} catch (ArrayIndexOutOfBoundsException e) {}

	}
	

	
}
```

Main-Klasse:

```
public class Main {
	
	public static MinesweeperGUI game1;
    public static Startbildschirm start1;
    public static int boundX = 335;
    public static int boundY = 428;



	/**
	 * @param args
	 */
	public static void main(String[] args) {
	    
		// Standard-Spielstart
	    start1 = new Startbildschirm();
		game1 = new MinesweeperGUI(10, 10, 10);

		game1.resetFelderAufgedeckt();
		game1.minenLegen();
	    game1.setBounds(50, 50, boundX, boundY);
	    game1.setVisible(true);
	    
	    JHighscore test = new JHighscore();
	    test.setVisible(true);
	}
	
	
	public static void starteSpielNeu() {
		
		game1.dispose();
		game1 = new MinesweeperGUI(start1.getSpalten(), start1.getZeilen(), start1.getMinen());
	    game1.setBounds(50, 50, boundX, boundY);
		game1.resetFelderAufgedeckt();
		game1.minenLegen();
	    game1.setVisible(true);

    }
	
    public static void setNewBounds(int boundNewX, int boundNewY) {
    	boundX = boundNewX;
    	boundY = boundNewY;
    	System.out.println("Methode: " + boundX);
    }
}
```


Vielen, lieben Dank für eure Mithilfe!  


Liebe Grüße


----------



## Oliver530 (3. Jun 2012)

Anhang:

Startbildschirm-Klasse:

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.border.EtchedBorder;



public class Startbildschirm extends JPanel{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JLabel labelSchwierigkeitsgrad = new JLabel("Schwierigkeitsgrad: ");
	private JLabel labelInfo = new JLabel("Neuer Größe wird erst bei 'Neues Spiel' aktualisiert");
	
	private JRadioButton radioEinfach = new JRadioButton("Einfach (10x10) - 10 Minen");
	private JRadioButton radioFortgeschritten = new JRadioButton("Fortgeschritten (16x16) - 40 Minen");
	private JRadioButton radioProfi = new JRadioButton("Profi (22x22) - 80 Minen");
	// Benutzerdefiniert?
	
	// private JButton startButton = new JButton("Spiel Starten!");
	
	private int gridSpalten = 10;
    private int gridZeilen = 10;
    private int maxMinen = 10;
    private int boundX = 330;
    private int boundY = 430;
    
    public int getSpalten() {
    	return gridSpalten;
    }
    
    public int getZeilen() {
    	return gridZeilen;
    }
    
    public int getMinen() {
    	return maxMinen;
    }
    
    private JPanel panelGesamt = new JPanel();

    
	public Startbildschirm() {

		panelGesamt.setLayout(new BorderLayout());
	    
	    // evtl noch etwas zum Panel hinzufügen
	    JPanel panelTitel = new JPanel();
	    panelTitel.add(labelSchwierigkeitsgrad);
	    panelGesamt.add(panelTitel, BorderLayout.PAGE_START);
	    
		ButtonGroup radioGroup = new ButtonGroup();
		radioGroup.add(radioEinfach);
		radioGroup.add(radioFortgeschritten);
		radioGroup.add(radioProfi);
		radioEinfach.setSelected(true);
		
		JPanel panelRadio = new JPanel();
		panelRadio.setLayout(new BoxLayout(panelRadio, BoxLayout.Y_AXIS));
		panelRadio.add(radioEinfach);
		panelRadio.add(radioFortgeschritten);
		panelRadio.add(radioProfi);
        panelRadio.setBackground(Color.WHITE);
        panelRadio.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
		
		RadioListener myRadioListener = new RadioListener();
		radioEinfach.addActionListener(myRadioListener);
		radioFortgeschritten.addActionListener(myRadioListener);
		radioProfi.addActionListener(myRadioListener);
		
		panelGesamt.add(panelRadio, BorderLayout.CENTER);
		panelGesamt.add(labelInfo, BorderLayout.PAGE_END);
		
		
		add(panelGesamt);
		

	}
	
	class RadioListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {

			System.out.println("Spalte: " + gridSpalten + ", Zeile: " + gridZeilen + ", Mine: " + maxMinen);

	        if (e.getActionCommand() == "Einfach (10x10) - 10 Minen") {
	        	gridSpalten = 10;
	        	gridZeilen = 10;
	        	maxMinen = 10;
	            boundX = 335;
	            boundY = 428;

	        } else if (e.getActionCommand() == "Fortgeschritten (16x16) - 40 Minen") {
	        	gridSpalten = 16;
	        	gridZeilen = 16;
	        	maxMinen = 40;
	        	boundX = 489;
	            boundY = 542;

	        } else if (e.getActionCommand() == "Profi (22x22) - 80 Minen") {
	        	gridSpalten = 22;
	        	gridZeilen = 22;
	        	maxMinen = 80;
	        	boundX = 707;
	            boundY = 752;

			}
	        Main.game1.setNeueGroesse(gridSpalten, gridZeilen, maxMinen);
	        Main.setNewBounds(boundX, boundY);

			
	        
	        

		}
		
	}
	
}
```

JHighscore-Klasse: (an der bin ich gerade noch aktuell)

```
import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.*;


public class JHighscore extends JPanel{

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

	private static String [] [] eintraegeArray = new String[10][2];
//	String [] [] eintraegeArray = new String [] [] {{"Ingo", "654"},{"df", "232"},{"fdsf", "545"}, {"dd", "654"}, {"Ingo", "654"}, {"Ingo", "654"}, {"Ingo", "654"}, {"Ingo", "654"}, {"Ingo", "654"}, {"Ingo", "654"}};
	private static int anzahlEintraege = 0;
	
	
	
	private JLabel labelBestenliste = new JLabel("<html>Bestenliste: <br> ************</html>");


	
	private JPanel panelBestenlisteLinks = new JPanel();
	private JPanel panelBestenlisteRechts = new JPanel();
	private JPanel panelCenter = new JPanel();


	
	public JHighscore() {
		
		setLayout(new BorderLayout());
		add(labelBestenliste, BorderLayout.PAGE_START);
		
		panelCenter.setLayout(new GridLayout(0, 2));
		
		panelBestenlisteLinks.setLayout(new BoxLayout(panelBestenlisteLinks, BoxLayout.Y_AXIS));
		for (int i = 0; i < anzahlEintraege; i++) {
			if ( eintraegeArray[i][0] == null ) {
				eintraegeArray[i][0] = "     -empty-";
			}
			panelBestenlisteLinks.add(new JLabel((i+1) + ". " + eintraegeArray[i][0]));
		}
		panelCenter.add(panelBestenlisteLinks);

		panelBestenlisteRechts.setLayout(new BoxLayout(panelBestenlisteRechts, BoxLayout.Y_AXIS));
		for (int i = 0; i < anzahlEintraege; i++) {
			if ( eintraegeArray[i][1] == null ) {
				eintraegeArray[i][1] = "999";
			}
			panelBestenlisteRechts.add(new JLabel(eintraegeArray[i][1]));
		}
		panelCenter.add(panelBestenlisteRechts);
		add(panelCenter, BorderLayout.CENTER);

	}
	
	public static void highscoreEintragen(String name, int zeitNeu) {
		
		String zeit = Integer.toString(zeitNeu);
		
		if ( anzahlEintraege < eintraegeArray.length ) {
			
			eintraegeArray[anzahlEintraege][0] = name;
			eintraegeArray[anzahlEintraege][1] = zeit;
			
			anzahlEintraege++;

			
		}
		
	}
	
	
}
```


----------



## Vancold (3. Jun 2012)

Hey!


Schreib einfach nochmal deine Probleme gerade.

Und mit casten meine ich folgendes.


Du weißt du hast in deinem MouseListener immer JButtonZustand Objekte wenn du e.getSource() aufrufst (du hast sie ja nur genau diesen Button zugewiesen).

D.h du könntest anstatt das du jetzt das ganze array abfragst einfach sagen


```
JButtonZustand buffer = (JButtonZustand) e.getSource();
```

Da müsstest du natürlich den Code anpassen das es passt.
Und ich würde dir den Tipp geben.

Ich würde das ganze nämlich so gestalten das du eben Darstellung hast durch die GUI und die Komponenten und die Komponente sich nicht drum kümmern muss ob was sie tut. das du so eine auswerte und erstell logik hast im Panel fürs spiel. die erstellt die Jbuttons und teilt ihnen mit wie viele Minene drum herum sind. das einzige was die JButton dann machen müssen ist wenn sie die Logik fragt was der Zustand ist. (und halt gut aussehen )



lg

Rene


----------



## Oliver530 (3. Jun 2012)

> Schreib einfach nochmal deine Probleme gerade.


Meinst du damit, ich sollte für das doClick()-Problem ein neues Thema erstellen?



> Du weißt du hast in deinem MouseListener immer JButtonZustand Objekte wenn du e.getSource() aufrufst (du hast sie ja nur genau diesen Button zugewiesen).
> 
> D.h du könntest anstatt das du jetzt das ganze array abfragst einfach sagen
> 
> ...


Ah, du meinst, dass ich quasi das ganze mit einer .getX() und getY() Methode lösen könnte?
Das wäre um einiges eleganter, ja! 



> Ich würde das ganze nämlich so gestalten das du eben Darstellung hast durch die GUI und die Komponenten und die Komponente sich nicht drum kümmern muss ob was sie tut. das du so eine auswerte und erstell logik hast im Panel fürs spiel. die erstellt die Jbuttons und teilt ihnen mit wie viele Minene drum herum sind. das einzige was die JButton dann machen müssen ist wenn sie die Logik fragt was der Zustand ist. (und halt gut aussehen )



Sorry, den Satz versteh ich noch nicht so ganz. ist vielleicht noch biischen früh... 

Danke für deinen Beitrag!


----------



## Vancold (3. Jun 2012)

Hey!


zum ersten Punkt.

Könntest du.Ich wäre nur über eine Zusammenfassung froh wo du gerade bist und Probleme hast.



Und zu Punkt 2. Ja dann müsstest du die Sachen also deine Objekte umschreiben und anpassen. wie gesagt das wäre wieder ein Aufwand aber du müsstest nicht die ganze Zeit mit dem Array arbeiten.


Punkt 3 sollte folgendes heißen.

Du hast eine klare Aufteilung. D.h deine GUI als ganzes die für die Darstellung da ist. Weiters wirst du in die GUI die Logik implementieren. Du könntest dafür methoden schreiben oder eine ganze Klasse wie du willst. und das ganze verpackst du eben in deinen Frame. das hab ich gemeint.

Wobei der JButtonZustand nichts auswerten muss. das macht alles die Logik.

Dein Button ist nur da um etwas anzuzeigen und zurück zugeben (oder setzen) d.h getter und setter und in der GUI darstellen 

Das macht das ganze auch einfacher.



Lg

Rene


----------

