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
 
Du hast zwei Instanzen von deinem Spielbrett und müsstest das Spielbrett-Object deinem TicTacToe Object übergeben und dieses dann disposen.
 
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 🙁
 
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.
 

Neue Themen


Zurück
Oben