Innere Klassen, ZugriffsProbleme

Melisa-Maria

Mitglied
Hallo Leute,

ich wollte TicTacToe-Spiel in Java programmieren, hab schon irgendwas :) geschrieben aber ich stehe leider auf dem Schlauch :(

Java:
public class Spielbrett {
	
	JFrame gameSelectFrame = new JFrame("SpielAuswahl");
	JButton ticTacToeButton = new JButton("TicTacToe");
	//JButton sudokuButton = new JButton("Sudoku");
	
	private void setFontAndFrameLayout()
	{
		Font ticTacToeAndSudokuButtonFont = new Font(Font.SERIF, Font.BOLD, 28);
		ticTacToeButton.setFont(ticTacToeAndSudokuButtonFont);
		sudokuButton.setFont(ticTacToeAndSudokuButtonFont);
		
		gameSelectFrame.setLayout(new GridLayout(0,1,4,4));
	}
	
	public void gameSelect()
	{
		setFontAndFrameLayout();
		gameSelectFrame.add(ticTacToeButton);
		gameSelectFrame.add(sudokuButton);
		
		gameSelectFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gameSelectFrame.setSize(300,300);
		gameSelectFrame.setVisible(true);
		
		ticTacToeButton.addActionListener(new TikTacToeButtonListener());
	}
	
	public class TikTacToeButtonListener implements ActionListener
	{
		 JFrame tikTakToeModiFrame = new JFrame("Modifikation");
		
		
		 JRadioButton dreiMalDreiRadioButton = new JRadioButton("TicTacToe (3x3)");
		 JRadioButton vierMalVierRadioButton = new JRadioButton("TicTacToe (4x4)");
		private ButtonGroup bg = new ButtonGroup();

		@Override
		public void actionPerformed(ActionEvent arg0) {
			
			tikTakToeModiFrame.setLayout(new GridLayout(0,1,4,4));
			
			tikTakToeModiFrame.add(dreiMalDreiRadioButton);
			tikTakToeModiFrame.add(vierMalVierRadioButton);
			
			Font bigFont = new Font(Font.SERIF, Font.BOLD, 20);
			dreiMalDreiRadioButton.setFont(bigFont);
			vierMalVierRadioButton.setFont(bigFont);
			
			dreiMalDreiRadioButton.setBackground(Color.MAGENTA);
			vierMalVierRadioButton.setBackground(Color.yellow);
			
			bg.add(dreiMalDreiRadioButton);
			bg.add(vierMalVierRadioButton);
			
			tikTakToeModiFrame.pack();
			tikTakToeModiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			tikTakToeModiFrame.setVisible(true);
			
			
			dreiMalDreiRadioButton.addActionListener(new TicTacToe());
			vierMalVierRadioButton.addActionListener(new TicTacToe());
		}
		
	}

}

Java:
public class TicTacToe implements ActionListener{
	
	private JFrame dreiMaldreiFrame = new JFrame("TicTacToe (3x3)");
	
	private JButton button1 = new JButton("");
	private JButton button2 = new JButton("");
	private JButton button3 = new JButton("");
	private JButton button4 = new JButton("");
	private JButton button5 = new JButton("");
	private JButton button6 = new JButton("");
	private JButton button7 = new JButton("");
	private JButton button8 = new JButton("");
	private JButton button9 = new JButton("");
	
	int count = 0;
	boolean winner = false;
	
	
	
	Spielbrett s = new Spielbrett();
	Spielbrett.TikTacToeButtonListener t = s.new TikTacToeButtonListener();
	
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		if(e.getActionCommand().equals("TicTacToe (3x3)"))
		{
			t.tikTakToeModiFrame.dispose();
		  
		}
	}
}

Also t.tikTakToeModiFrame.dispose(); funktioniert nicht, keeeine Reaktion :( Und ich verstehe nicht was mache ich falsch oder wie kannich es korigierren :(

Ich hoffe ihr könnt mir helfen :)

LG Melisa
 

Flown

Administrator
Mitarbeiter
Du hast zwei Instanzen von deinem Spielbrett und müsstest das Spielbrett-Object deinem TicTacToe Object übergeben und dieses dann disposen.
 

Melisa-Maria

Mitglied
Hallo Flown,
danke Dir fuer Deine Antwort. Sowas habe ich auch gemacht aber immer noch funktioniert es nicht. Irgendwo mache ich Fehler aber, ich verstehe es nicht wo genau :(
 

Flown

Administrator
Mitarbeiter
Ich habe mir mal die Mühe gemacht deinen Code zu überarbeiten. Meiner Ansicht nach ist er sehr verwirrend und du hast wichtige Teile von OOP noch nicht verstanden (Datenkapselung, etc.). Nachdem ich dir deinen Code nicht schreiben werde, sondern nur deine Snippets verbessere kann ich dir nur auf deinen Weg mitgeben: Leg dir vorher einen Plan zurecht, nimm Stift und Papier in die Hand und modeliere deine Applikation.

Ich würde in deinem Falle sagen, dass die Klasse Spielbrett nicht für die Auswahl des Spiels zuständig sein sollte sondern eine Klasse GameConfigurator/GameManager. Dieser Konfiguriert dir deine Spiele und startet dann die richtigen Spiele mit dessen Parameter ->
Code:
new TicTacToe(rows, cols)
zum Beispiel.

Danach solltest du dir Gedanken machen, was du in jeder Klasse benötigst(wie du dann siehst, sind viele Felder in lokale Variable umgewandelt worden. Du fragst dich vielleicht warum? Einfache Antwort: weil man sie nicht als Felder benötigt).

ActionListener sind als Programmier-Usus meist anonyme Klassen und delegieren die Arbeit und steuern den Programmfluss.

Private Klassen sollte man tunlichst vermeiden, außer man verwendet sie in internen Datenstrukturen(z.B. wie bei LinkedLists die internen Knoten).

Achja Übung macht den Meister und hier dein Code:

Java:
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JRadioButton;

public class Spielbrett {
	
	public static void main(String[] args) {
		new Spielbrett().gameSelect();
	}
	
	private JFrame tikTakToeModiFrame = new JFrame("Modifikation");

	private void setFontAndFrameLayout(JFrame gameSelectFrame, JButton... buttons) {
		Font ticTacToeAndSudokuButtonFont = new Font(Font.SERIF, Font.BOLD, 28);
		for(JButton btn : buttons) {
			btn.setFont(ticTacToeAndSudokuButtonFont);
		}
		gameSelectFrame.setLayout(new GridLayout(0, 1, 4, 4));
	}

	public void gameSelect() {
		
		JFrame gameSelectFrame = new JFrame("SpielAuswahl");
		JButton ticTacToeButton = new JButton("TicTacToe");
		JButton sudokuButton = new JButton("Sudoku");
		
		setFontAndFrameLayout(gameSelectFrame, ticTacToeButton, sudokuButton);
		
		gameSelectFrame.add(ticTacToeButton);
		gameSelectFrame.add(sudokuButton);

		gameSelectFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gameSelectFrame.setSize(300, 300);
		gameSelectFrame.setVisible(true);

		ticTacToeButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				openModificationFrame();				
			}
		});
	}
	
	private void openModificationFrame() {
		JRadioButton dreiMalDreiRadioButton = new JRadioButton(
				"TicTacToe (3x3)");
		JRadioButton vierMalVierRadioButton = new JRadioButton(
				"TicTacToe (4x4)");
		ButtonGroup bg = new ButtonGroup();
		
		tikTakToeModiFrame.setLayout(new GridLayout(0, 1, 4, 4));
		
		tikTakToeModiFrame.add(dreiMalDreiRadioButton);
		tikTakToeModiFrame.add(vierMalVierRadioButton);
		
		Font bigFont = new Font(Font.SERIF, Font.BOLD, 20);
		dreiMalDreiRadioButton.setFont(bigFont);
		vierMalVierRadioButton.setFont(bigFont);
		
		dreiMalDreiRadioButton.setBackground(Color.MAGENTA);
		vierMalVierRadioButton.setBackground(Color.YELLOW);
		
		bg.add(dreiMalDreiRadioButton);
		bg.add(vierMalVierRadioButton);
		
		tikTakToeModiFrame.pack();
		tikTakToeModiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		tikTakToeModiFrame.setVisible(true);
		
		dreiMalDreiRadioButton.addActionListener(new TicTacToe(this));
		vierMalVierRadioButton.addActionListener(new TicTacToe(this));
		
	}

	public void disposeModicationFrame() {
		tikTakToeModiFrame.dispose();
	}
}

class TicTacToe implements ActionListener {

	private JFrame dreiMaldreiFrame = new JFrame("TicTacToe (3x3)");

	private JButton button1 = new JButton("");
	private JButton button2 = new JButton("");
	private JButton button3 = new JButton("");
	private JButton button4 = new JButton("");
	private JButton button5 = new JButton("");
	private JButton button6 = new JButton("");
	private JButton button7 = new JButton("");
	private JButton button8 = new JButton("");
	private JButton button9 = new JButton("");

	int count = 0;
	boolean winner = false;

	public TicTacToe(Spielbrett s) {
		this.s = s;
	}

	Spielbrett s;

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("TicTacToe (3x3)")) {
			s.disposeModicationFrame();
		}
	}
}

PS: Klassen sollten in jeweils eigene Dateien geschrieben werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L innere klassen AWT, Swing, JavaFX & SWT 3
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
R innere Action -> auf äußeres this zugreifen AWT, Swing, JavaFX & SWT 3
L innere Klasse bei GUI AWT, Swing, JavaFX & SWT 4
Spin Innere Klasse : kein static? AWT, Swing, JavaFX & SWT 8
Z Innere Frame in meiner JFrame. AWT, Swing, JavaFX & SWT 4
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
Ø Swing Button in anderer Klassen ausführen AWT, Swing, JavaFX & SWT 6
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
R JavaFX Java FXML Vererbung in Klassen AWT, Swing, JavaFX & SWT 9
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
D Zwei getrennte Java Klassen verbinden. Wie ? AWT, Swing, JavaFX & SWT 2
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
Soloeco Swing JTextField auslesen Klassen übergreifend AWT, Swing, JavaFX & SWT 16
K Wie kann ich eine Variable zwischen Tab Klassen weitergeben ? AWT, Swing, JavaFX & SWT 7
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
B Pong Projekt mit LWJGL Klassen exportieren AWT, Swing, JavaFX & SWT 14
M Swing Vorgehen beim Aufruf der Klassen/Methoden AWT, Swing, JavaFX & SWT 7
A Swing Externe Klassen aufrufen und in einem bereits vorhandenen Container einfügen AWT, Swing, JavaFX & SWT 0
D JavaFX @FXML Annotation mit Klassen und Instanzen verbinden? AWT, Swing, JavaFX & SWT 5
S Grafik in einer Klassen einfügen/hinzufügen AWT, Swing, JavaFX & SWT 1
M Swing MVC mit mehreren Klassen AWT, Swing, JavaFX & SWT 2
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
V kann ich in einer Klasse stage und scene deklarieren, aber in anderen Klassen Inhalte hinzufügen ? AWT, Swing, JavaFX & SWT 5
A Swing Zwei Klassen mit Textfeld Eingaben vergleichen und Ausgabe erzeugen AWT, Swing, JavaFX & SWT 10
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
Z Swing Von vielen Klassen auf ein GUI-Element zugreifen AWT, Swing, JavaFX & SWT 10
F Swing JAVA GUI Übergabe von Werten zwischen mehreren Fenstern/Klassen AWT, Swing, JavaFX & SWT 10
C In Hauptfenster Programm-Klassen implementieren AWT, Swing, JavaFX & SWT 9
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
B 2 Klassen Kommunikation AWT, Swing, JavaFX & SWT 4
P versch. JPanel Klassen über Menü öffnen AWT, Swing, JavaFX & SWT 12
E Swing auf klassen zugreifen AWT, Swing, JavaFX & SWT 2
A Daten umherschieben zwischen zwei Klassen AWT, Swing, JavaFX & SWT 40
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
3 JFrame in Klassen aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Beziehungen zwischen 3 Klassen AWT, Swing, JavaFX & SWT 4
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
lumo SWT Table und Klassen AWT, Swing, JavaFX & SWT 14
S import von Klassen (zwei Panels eine Form) AWT, Swing, JavaFX & SWT 39
B abstrakte klassen / anonyme klassen AWT, Swing, JavaFX & SWT 4
B Swing Passendes Layout finden: Welche Klassen muss ich wie anwenden? AWT, Swing, JavaFX & SWT 8
H Swing Prog in mehrere Klassen zerlegen AWT, Swing, JavaFX & SWT 13
G Variblenwert zwischen zwei Klassen übergeben AWT, Swing, JavaFX & SWT 3
G Prinzipelles zum Umgang von Klassen untereinander AWT, Swing, JavaFX & SWT 4
M JTree und TreeModel mit 2 Klassen AWT, Swing, JavaFX & SWT 3
T Kommunikation zwischen Zwei GUI-Klassen AWT, Swing, JavaFX & SWT 2
J Unterschied zwischen nicht-statischen und statischen Klassen AWT, Swing, JavaFX & SWT 5
H jar-archive mit mehreren Klassen erstellen AWT, Swing, JavaFX & SWT 3
G Grafik auf mehrere Methoden/Klassen zerlegen AWT, Swing, JavaFX & SWT 2
D Event Klassen AWT, Swing, JavaFX & SWT 2
A JTextArea-Problem in Inneren Klassen und Packages AWT, Swing, JavaFX & SWT 3
G Klassen übergreifen AWT, Swing, JavaFX & SWT 4
G ActionListener und Methoden-Aufruf aus anderen Klassen AWT, Swing, JavaFX & SWT 3
G Prob mit 2 Klassen und set Methode AWT, Swing, JavaFX & SWT 6
G externe klassen auf gui objekte zugreifen lassen AWT, Swing, JavaFX & SWT 11
M Zugriffsprobleme bei Oberflächenprogrammierung AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben