ActionListener von eigener ButtonKlasse

Oliver530

Mitglied
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:
Code:
grid[x][y].addActionListener(myActionListener);

Vielen Dank schonmal für eure Hilfe! :)

Java:
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:

Java:
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

Aktives Mitglied
Java:
grid[x][y].addActionListener(myActionListener);
muss
Java:
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 :D[/EDIT]
 
Zuletzt bearbeitet:
S

SlaterB

Gast
Klassen schreibt man groß und

Java:
panelAnzeige.setLayout(FlowLayout);
statt
Java:
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

Mitglied
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
Java:
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:
Java:
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:
Java:
public class Main {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
			MinesweeperGUI game1 = new MinesweeperGUI();
		
		
	}

}

Vielen Dank! :)
 

Blackhole16

Bekanntes Mitglied
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

Mitglied
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?

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

MinesweeperGUI-Klasse:
Java:
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

Bekanntes Mitglied
Java:
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

Java:
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
Java:
setSize(400, 500);
setLocation(150, 150);
//...
setVisible(true);
aus dem konstruktor löschen und in die mein rein:

Java:
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? :D

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 :p

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

Mitglied
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
Code:
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

Mitglied
Hat sich erledigt! :)

Code:
private static MinesweeperGUI game1;

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

    }

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

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

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? :)
 
Zuletzt bearbeitet:

Blackhole16

Bekanntes Mitglied
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

Aktives Mitglied
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

Mitglied
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: :D )

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
Code:
	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:
Java:
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:
Java:
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:
Java:
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! :) :oops:


Liebe Grüße
 

Oliver530

Mitglied
Anhang:

Startbildschirm-Klasse:
Java:
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)
Java:
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

Aktives Mitglied
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

Java:
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 :p)



lg

Rene
 
Zuletzt bearbeitet:

Oliver530

Mitglied
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

Java Code:
1
JButtonZustand buffer = (JButtonZustand) e.getSource();

Da müsstest du natürlich den Code anpassen das es passt.
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 :p)

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

Danke für deinen Beitrag! :)
 

Vancold

Aktives Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10
M Anonymer ActionListener AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
M getSource() findet Button nicht - ActionListener AWT, Swing, JavaFX & SWT 4
S Swing mit ActionListener auf Objekte einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 3
G Swing Button ActionListener macht komische Sachen AWT, Swing, JavaFX & SWT 19

Ähnliche Java Themen

Neue Themen


Oben