Timer, TimerTask und Warten

BlunatiX

Mitglied
Hallo liebe Community,
ich sitze für ein Uni-Projekt an einem Java-Programm, nämlich dem 2-Spieler-Reaktor (vielleicht kennen ihn einige von euch vom Handy).
Jetzt versuche ich gerade ein TicTacToe umzusetzen, bei dem die Kreuze bzw. Kreise vom Computer in 1,5 Sekundenabständen zufällig gesetzt werden und der Benutzer nur drücken soll (um einen Punkt zu bekommen), sobald er drei Kreuze oder Kreise in einer Reihe sieht.
Das ganze läuft mittlerweile auch, allerdings überhaupt nicht zu meiner Zufriedenheit (sehr buggy).
Könntet ihr bitte einmal über den Quelltext schauen. Ich vermute ja, dass der Timer/TimerTask sprich das Warten der Knackpunkt ist, bei dem alles noch nicht wirklich zusammenpasst.
Probleme die ich momentan habe sind:
- Machmal sind die Intervalle von 1,5 Sekunden zwischen den Kreisen bzw. Kreuzen wesentlich kürzer (ca. 0,5 Sekunden)
- Nachdem einer der Spieler gedrückt hat soll ja kein weiterer Kreis/Kreuz erscheinen, allerdings wird immer noch ein Weiterer hinzugefügt.
Falls euch die Klasse für das TicTacToe an Quelltext nicht ausreicht sagt Bescheid, dann kann ich auch noch mehr posten.
Schonmal danke für die Hilfe!

Hier ein Bild, damit ihr euch das Ganze etwas vorstellen könnt:


Hier ist mein Quellcode:
Java:
// Importe
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

// Klasse TicTacToe für das TicTacToeSpiel 
public class TicTacToe {

// Einbinden anderer Klassen
	Menu Menu = new Menu();
	Sieger Sieger = new Sieger();

	// Klassen-Initialisierungen (JFrame und JPanel)
	JFrame fTicTacToe;
	JPanel pTicTacToe;
	
	// Methoden-Initialisierungen (Label, Button und Random)
	JLabel labSpielstand;
	JLabel labTicTacToeUeberschrift;
	JLabel labTicTacToeAnzeige;
	JLabel labTicTacToeKreis1;
	JLabel labTicTacToeKreis2;
	JLabel labTicTacToeKreis3;
	JLabel labTicTacToeKreis4;
	JLabel labTicTacToeKreis5;
	JLabel labTicTacToeKreuz1;
	JLabel labTicTacToeKreuz2;
	JLabel labTicTacToeKreuz3;
	JLabel labTicTacToeKreuz4;

	JLabel labTicTacToeBild;
	JLabel labTicTacToeBildRaster;
	
	JButton bTicTacToeNext;
	
	Random tictactoeZufallszahl;
	
	// Bilderimport
	Icon iconTicTacToeHintergrund = new ImageIcon(getClass().getResource("ImageTTT.png"));
	Icon iconTicTacToeRaster = new ImageIcon(getClass().getResource("ImageTTTRaster.png"));
	
	//Anlegen einer Farbe
	Color panelblau = new Color(110, 205, 235);
	
	// Variablen-Deklaration und -Initialisierung (boolean und int)
	boolean		booleanTicTacToeAbgleich;
	int 		tictactoeRandomZeile,
				tictactoeRandomSpalte,
				tictactoeWechselKreisKreuz = 1,
				tictactoeLaufvariableAnzeigen = -1,
				tictactoeLaufvariableRunden = 0,
				tictactoeAbgleichLaufvariable,
				tictactoeWechselvariable = 1,
				tictactoeWechselvariableStop = 0;
	int[][] 	tictactoeDatenbank;
	int[][][]	tictactoeDatenbankKoordinaten;
	
	// Methode TicTacToeSpiel als Fenster für die Darstellung des TicTacToeSpiels
	public void TicTacToeSpiel() {
		
		// JFrame: Klassendeklaration und Klassenkonkretisierung
		fTicTacToe = new JFrame("2-Spieler-Reaktor");
		fTicTacToe.setSize(800, 600);
		fTicTacToe.setLocationRelativeTo(null);
		fTicTacToe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fTicTacToe.setLayout(null);
		fTicTacToe.setResizable(false);
		fTicTacToe.setVisible(true);
		fTicTacToe.setFocusable(true);
		
		// JPanel: Klassendeklaration und Klassenkonkretisierung
		pTicTacToe = new JPanel();
		pTicTacToe.setBounds(280, 180, 240, 240);
		pTicTacToe.setBackground(panelblau);
		pTicTacToe.setLayout(null);
		
		// JMenuBar: Aufrufen einer Methode und Einbinden der Menüleiste
		Menu.MenuBarAnzeigen();
		fTicTacToe.setJMenuBar(Menu.MenuBar);
				
		// JLabel: Methodendeklaration und Methodenkonkretisierung (14 Label)
		labSpielstand = new JLabel("Spielstand  " + Spielstand.spielstandSpieler1 + " : " + Spielstand.spielstandSpieler2);
		labSpielstand.setBounds(567, 99, 160, 25);
		labSpielstand.setHorizontalAlignment(SwingConstants.RIGHT);
		labSpielstand.setFont(new Font("Tahoma", Font.PLAIN, 18));

		labTicTacToeUeberschrift = new JLabel("Tic Tac Toe");
		labTicTacToeUeberschrift.setBounds(280, 60, 240, 40);
		labTicTacToeUeberschrift.setHorizontalAlignment(SwingConstants.CENTER);
		labTicTacToeUeberschrift.setVerticalAlignment(SwingConstants.TOP);
		labTicTacToeUeberschrift.setFont(new Font("Tahoma", Font.BOLD, 25));

		labTicTacToeAnzeige = new JLabel("Hier gehts gleich los. (Enter)");
		labTicTacToeAnzeige.setBounds(200, 435, 400, 25);
		labTicTacToeAnzeige.setHorizontalAlignment(SwingConstants.CENTER);
		labTicTacToeAnzeige.setVerticalAlignment(SwingConstants.TOP);
		labTicTacToeAnzeige.setFont(new Font("Tahoma", Font.PLAIN, 18));
		
		labTicTacToeKreis1 = new JLabel("");
		labTicTacToeKreis2 = new JLabel("");
		labTicTacToeKreis3 = new JLabel("");
		labTicTacToeKreis4 = new JLabel("");
		labTicTacToeKreis5 = new JLabel("");
		labTicTacToeKreuz1 = new JLabel("");
		labTicTacToeKreuz2 = new JLabel("");
		labTicTacToeKreuz3 = new JLabel("");
		labTicTacToeKreuz4 = new JLabel("");
		
		labTicTacToeBild = new JLabel(iconTicTacToeHintergrund);
		labTicTacToeBild.setBounds(0, 0, 790, 550);
		
		labTicTacToeBildRaster = new JLabel(iconTicTacToeRaster);
		labTicTacToeBildRaster.setBounds(0, 0, 790, 550);
		
		// JButton: Methodendeklaration und Methodenkonkretisierung (1 Button)
		bTicTacToeNext = new JButton("Siegerehrung");
		bTicTacToeNext.setBounds(320, 485, 160, 50);
		bTicTacToeNext.setFont(new Font("Tahoma", Font.BOLD, 15));
		bTicTacToeNext.addActionListener(new ActionHandler());

		// Einbindung der KeyListener
		fTicTacToe.addKeyListener(new KeyHandler());

		// Einbindung der Methoden in die JFrame-Klasse/JPanel-Klasse
		fTicTacToe.add(labTicTacToeBildRaster);
		pTicTacToe.add(labTicTacToeKreis1);
		pTicTacToe.add(labTicTacToeKreis2);
		pTicTacToe.add(labTicTacToeKreis3);
		pTicTacToe.add(labTicTacToeKreis4);
		pTicTacToe.add(labTicTacToeKreis5);
		pTicTacToe.add(labTicTacToeKreuz1);
		pTicTacToe.add(labTicTacToeKreuz2);
		pTicTacToe.add(labTicTacToeKreuz3);
		pTicTacToe.add(labTicTacToeKreuz4);
		fTicTacToe.add(labSpielstand);
		fTicTacToe.add(labTicTacToeUeberschrift);
		fTicTacToe.add(labTicTacToeAnzeige);
		fTicTacToe.add(pTicTacToe);	
		fTicTacToe.add(labTicTacToeBild);
		
	}
	
	// Methode TicTacToeDatenbank für Datenbankeinträge
	private void TicTacToeDatenbank() {
		// Deklarierung eines intArrays
		tictactoeDatenbank = new int[3][3];
		
		// Anlegen der Datenbankeinträge
		// 0 = Leer; 1 = Kreis; 2 = Kreuz
		tictactoeDatenbank[0][0] = 0;
		tictactoeDatenbank[0][1] = 0;
		tictactoeDatenbank[0][2] = 0;
		
		tictactoeDatenbank[1][0] = 0;
		tictactoeDatenbank[1][1] = 0;
		tictactoeDatenbank[1][2] = 0;
		
		tictactoeDatenbank[2][0] = 0;
		tictactoeDatenbank[2][1] = 0;
		tictactoeDatenbank[2][2] = 0;
		
		// Deklarierung eines intArrays
		tictactoeDatenbankKoordinaten = new int[3][3][2];
		
		// Anlegen der Datenbankeinträge
		// Koordinaten für die einzelnen TicTacToe-Felder
		tictactoeDatenbankKoordinaten[0][0][0] = 0;
		tictactoeDatenbankKoordinaten[0][0][1] = 0;		
		tictactoeDatenbankKoordinaten[0][1][0] = 80;
		tictactoeDatenbankKoordinaten[0][1][1] = 0;
		tictactoeDatenbankKoordinaten[0][2][0] = 160;
		tictactoeDatenbankKoordinaten[0][2][1] = 0;

		tictactoeDatenbankKoordinaten[1][0][0] = 0;
		tictactoeDatenbankKoordinaten[1][0][1] = 80;
		tictactoeDatenbankKoordinaten[1][1][0] = 80;
		tictactoeDatenbankKoordinaten[1][1][1] = 80;
		tictactoeDatenbankKoordinaten[1][2][0] = 160;
		tictactoeDatenbankKoordinaten[1][2][1] = 80;

		tictactoeDatenbankKoordinaten[2][0][0] = 0;
		tictactoeDatenbankKoordinaten[2][0][1] = 160;
		tictactoeDatenbankKoordinaten[2][1][0] = 80;
		tictactoeDatenbankKoordinaten[2][1][1] = 160;
		tictactoeDatenbankKoordinaten[2][2][0] = 160;
		tictactoeDatenbankKoordinaten[2][2][1] = 160;
		
		// Leeren der TicTacToe-Spielfeldfelder, damit neue Runde begonnen werden kann
		labTicTacToeKreis1.setText("");
		labTicTacToeKreis2.setText("");
		labTicTacToeKreis3.setText("");
		labTicTacToeKreis4.setText("");
		labTicTacToeKreis5.setText("");
		labTicTacToeKreuz1.setText("");
		labTicTacToeKreuz2.setText("");
		labTicTacToeKreuz3.setText("");
		labTicTacToeKreuz4.setText("");

	}
	
	// Methode TicTacToeRandom zur Auswahl eines beliebigen, leeren Feldes
	private void TicTacToeRandom() {
		// Zufälliges, freies Feld auswählen und je nachdem, ob Kreis oder Kreuz am Zug ist, zuordnen
		do {
		tictactoeZufallszahl = new Random();
		tictactoeRandomZeile = tictactoeZufallszahl.nextInt(3);
		tictactoeRandomSpalte = tictactoeZufallszahl.nextInt(3);
		} while (tictactoeDatenbank[tictactoeRandomZeile][tictactoeRandomSpalte] == 1 
				|| tictactoeDatenbank[tictactoeRandomZeile][tictactoeRandomSpalte] == 2);	
		if (tictactoeWechselKreisKreuz == 1) {
			tictactoeDatenbank[tictactoeRandomZeile][tictactoeRandomSpalte] = 1;
		} else if (tictactoeWechselKreisKreuz == 2) {
			tictactoeDatenbank[tictactoeRandomZeile][tictactoeRandomSpalte] = 2;
		}
		if (tictactoeWechselKreisKreuz == 1) {
			tictactoeWechselKreisKreuz = 2;
		} else if (tictactoeWechselKreisKreuz == 2) {
			tictactoeWechselKreisKreuz = 1;
		}
	}

	// Methode TicTacToeAbgleich zum Abgleich, ob bereits eine richtige Kombination vorliegt
	private void TicTacToeAbgleich() {
		booleanTicTacToeAbgleich = false;
		for (tictactoeAbgleichLaufvariable = 0; tictactoeAbgleichLaufvariable <= 2; tictactoeAbgleichLaufvariable++) {
			// Zeilenabgleich auf drei Kreise/Kreuze in Reihe
			if (	(tictactoeDatenbank[tictactoeAbgleichLaufvariable][0] == 1 
				 &&  tictactoeDatenbank[tictactoeAbgleichLaufvariable][1] == 1 
				 &&  tictactoeDatenbank[tictactoeAbgleichLaufvariable][2] == 1)
				 ||	(tictactoeDatenbank[tictactoeAbgleichLaufvariable][0] == 2 
				 &&  tictactoeDatenbank[tictactoeAbgleichLaufvariable][1] == 2
				 &&  tictactoeDatenbank[tictactoeAbgleichLaufvariable][2] == 2)) {
				booleanTicTacToeAbgleich = true;
			} 
			// Spaltenabgleich auf drei Kreise/Kreuze in Reihe
			else if (	(tictactoeDatenbank[0][tictactoeAbgleichLaufvariable] == 1 
					 &&  tictactoeDatenbank[1][tictactoeAbgleichLaufvariable] == 1 
					 &&  tictactoeDatenbank[2][tictactoeAbgleichLaufvariable] == 1)
					 || (tictactoeDatenbank[0][tictactoeAbgleichLaufvariable] == 2 
					 &&  tictactoeDatenbank[1][tictactoeAbgleichLaufvariable] == 2 
					 &&  tictactoeDatenbank[2][tictactoeAbgleichLaufvariable] == 2)) {
				booleanTicTacToeAbgleich = true;
			} 
		}
		// Diagonalenabgleich auf drei Kreise/Kreuze in Reihe
		if ((tictactoeDatenbank[0][0] == 1 
		 &&  tictactoeDatenbank[1][1] == 1 
		 &&  tictactoeDatenbank[2][2] == 1)
		 || (tictactoeDatenbank[0][0] == 2 
		 &&	 tictactoeDatenbank[1][1] == 2 
		 &&	 tictactoeDatenbank[2][2] == 2) 
		 ||	(tictactoeDatenbank[0][2] == 1 
		 &&  tictactoeDatenbank[1][1] == 1 
		 &&  tictactoeDatenbank[2][0] == 1)
		 || (tictactoeDatenbank[0][2] == 2 
		 &&  tictactoeDatenbank[1][1] == 2 
		 &&  tictactoeDatenbank[2][0] == 2)) {
			booleanTicTacToeAbgleich = true;
		}
	}
	
	// Methode TicTacToeTimerTask, um alle 1,5 sek einen neuen Kreis/Kreuz anzeigen zu lassen
	// und sobald alle Kreise/Kreuze gesetzt sind eine neue Runde zu starten
	private void TicTacToeTimerTask() {
		TimerTask tictactoeSetzen = new TimerTask() {
			public void run() {
				// Abprüfen der Endbedingungen für den TimerTask
				if (tictactoeLaufvariableAnzeigen == 9) {
					cancel();
					tictactoeWechselvariable = 1;
					labTicTacToeAnzeige.setText("Gleich gehts weiter! (Enter)");
				} else if (tictactoeWechselvariableStop == 1) {
					cancel();
				}
				// Setzen der Kreise und Kreuze nacheinander bis Spielfeld komplett voll
				if (tictactoeLaufvariableAnzeigen == 0) {
					// Kreis1
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreis1.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreis1.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis1.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis1.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreis1.setText("o");
				} else if (tictactoeLaufvariableAnzeigen == 1) {
					// Kreuz1
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreuz1.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreuz1.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreuz1.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreuz1.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreuz1.setText("x");
				} else if (tictactoeLaufvariableAnzeigen == 2) {
					// Kreis2
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreis2.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreis2.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis2.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis2.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreis2.setText("o");
				} else if (tictactoeLaufvariableAnzeigen == 3) {
					// Kreuz2
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreuz2.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreuz2.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreuz2.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreuz2.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreuz2.setText("x");
				} else if (tictactoeLaufvariableAnzeigen == 4) {
					// Kreis3
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreis3.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreis3.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis3.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis3.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreis3.setText("o");
				} else if (tictactoeLaufvariableAnzeigen == 5) {
					// Kreuz3
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreuz3.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreuz3.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreuz3.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreuz3.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreuz3.setText("x");
				} else if (tictactoeLaufvariableAnzeigen == 6) {
					// Kreis4
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreis4.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreis4.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis4.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis4.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreis4.setText("o");
				} else if (tictactoeLaufvariableAnzeigen == 7) {
					// Kreuz4
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreuz4.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreuz4.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreuz4.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreuz4.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreuz4.setText("x");
				} else if (tictactoeLaufvariableAnzeigen == 8) {
					// Kreis5
					TicTacToeRandom();
					TicTacToeAbgleich();
					labTicTacToeKreis5.setBounds(tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][0]+3, tictactoeDatenbankKoordinaten[tictactoeRandomZeile][tictactoeRandomSpalte][1]+3, 74, 74);
					labTicTacToeKreis5.setHorizontalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis5.setVerticalAlignment(SwingConstants.CENTER);
					labTicTacToeKreis5.setFont(new Font("Tahoma", Font.BOLD, 40));
					labTicTacToeKreis5.setText("o");
				}
				fTicTacToe.repaint();
				tictactoeLaufvariableAnzeigen++;
//				System.out.println(tictactoeLaufvariableAnzeigen + " " + booleanTicTacToeAbgleich);
			}
		};
		
		Timer tictactoeSetzenSchleife = new Timer();
		tictactoeSetzenSchleife.schedule(tictactoeSetzen, 0, 1500);
	}

	// ActionListener
	private class ActionHandler implements ActionListener {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			// ActionListener für Button (Funktion: Nächstes Spiel aufrufen bzw. Zurück zum Hauptmenü)
			if (e.getSource() == bTicTacToeNext) {
						Sieger.Siegerehrung();
						fTicTacToe.dispose();
			}
		}
	}
	
	// KeyListener
	public class KeyHandler implements KeyListener {
		@Override
		public void keyPressed(KeyEvent e) {
			// KeyListener für die Enter-Taste
			if (e.getKeyCode() == KeyEvent.VK_ENTER) {
				// Wechselvariable, die festlegt, ob man gerade vom Anzeigeteil in den Korrekturteil springt oder umgekehrt
				// (1 = Korrekturteil zu Anzeigeteil, 0 = Anzeigeteil zu Korrekturteil)
				if (tictactoeWechselvariable == 1) {
					// Solange max. Rundenanzahl noch nicht erreicht ist: Anzeigen eines neuen TicTacToe-Spiels
					if (tictactoeLaufvariableRunden < Einstellungen.einstellungenSpieldauer) {
						labTicTacToeAnzeige.setText("");
						tictactoeLaufvariableAnzeigen = -1;
						tictactoeLaufvariableRunden++;
						tictactoeWechselvariable = 0;
						tictactoeWechselvariableStop = 0;
						TicTacToeDatenbank();
						TicTacToeTimerTask();
					}
					// Sobald die max. Rundenanzahl erreicht ist: Anzeigen eines Buttons und keines neuen TicTacToes
					else if (tictactoeLaufvariableRunden == Einstellungen.einstellungenSpieldauer) {
						fTicTacToe.add(bTicTacToeNext);
						fTicTacToe.repaint();
						fTicTacToe.revalidate();
					}
				}
				else if (tictactoeWechselvariable == 0) {
					// Falls keiner der Spieler drücken möchte, wird die Runde hier neutral beendet
					if (tictactoeLaufvariableRunden <= Einstellungen.einstellungenSpieldauer) {
						
						tictactoeWechselvariableStop = 1;
						tictactoeWechselvariable = 1;
						labTicTacToeAnzeige.setText("Gleich gehts weiter! (Enter)");							
					}
				}
			}
		}
		
		@Override
		public void keyReleased(KeyEvent e) {
			
		}
		
		@Override
		public void keyTyped(KeyEvent e) {
			// KeyListener für die Spieler1-Taste
			if (e.getKeyChar() == Einstellungen.einstellungenTastenBelegungSpieler1) {
				// Wechselvariable, die festlegt, ob man gerade vom Anzeigeteil in den Korrekturteil springt oder umgekehrt
				// (1 = Korrekturteil zu Anzeigeteil, 0 = Anzeigeteil zu Korrekturteil)
				if (tictactoeWechselvariable == 0) {
					// Solange max. Rundenanzahl noch nicht überschritten ist:
					// Punktevergabe an den zuerst drückenden Spieler und Wechsel in den Korrekturteil
					if (tictactoeLaufvariableRunden <= Einstellungen.einstellungenSpieldauer) {
						// Falls ein Spieler drückt und das TicTacToe richtig ist:
						// Pluspunkt
						tictactoeWechselvariableStop = 1;
						tictactoeWechselvariable = 1;
						labTicTacToeAnzeige.setText("Gleich gehts weiter! (Enter)");
						if (booleanTicTacToeAbgleich == true) {
							Spielstand.spielstandSpieler1++;
							labSpielstand.setText("Spielstand  " + Spielstand.spielstandSpieler1 + " : " + Spielstand.spielstandSpieler2);
						}
						// Falls ein Spieler drückt und das TicTacToe falsch ist: 
						// Minuspunkt
						else if (booleanTicTacToeAbgleich == false) {
							Spielstand.spielstandSpieler1--;
							labSpielstand.setText("Spielstand  " + Spielstand.spielstandSpieler1 + " : " + Spielstand.spielstandSpieler2);
						}
					}
				}
			}
			// KeyListener für die Spieler2-Taste
			else if (e.getKeyChar() == Einstellungen.einstellungenTastenBelegungSpieler2) {
				// Wechselvariable, die festlegt, ob man gerade vom Anzeigeteil in den Korrekturteil springt oder umgekehrt
				// (1 = Korrekturteil zu Anzeigeteil, 0 = Anzeigeteil zu Korrekturteil)
				if (tictactoeWechselvariable == 0) {
					// Solange max. Rundenanzahl noch nicht überschritten ist:
					// Punktevergabe an den zuerst drückenden Spieler und Wechsel in den Korrekturteil
					if (tictactoeLaufvariableRunden <= Einstellungen.einstellungenSpieldauer) {
						// Falls ein Spieler drückt und das TicTacToe richtig ist:
						// Pluspunkt
						tictactoeWechselvariableStop = 1;
						tictactoeWechselvariable = 1;
						labTicTacToeAnzeige.setText("Gleich gehts weiter! (Enter)");
						if (booleanTicTacToeAbgleich == true) {
							Spielstand.spielstandSpieler2++;
							labSpielstand.setText("Spielstand  " + Spielstand.spielstandSpieler1 + " : " + Spielstand.spielstandSpieler2);
						}
						// Falls ein Spieler drückt und das TicTacToe falsch ist: 
						// Minuspunkt
						else if (booleanTicTacToeAbgleich == false) {
							Spielstand.spielstandSpieler2--;
							labSpielstand.setText("Spielstand  " + Spielstand.spielstandSpieler1 + " : " + Spielstand.spielstandSpieler2);
						}
					}
				}
			}
		}
	}
}
 
Zuletzt bearbeitet:

eMmiE

Bekanntes Mitglied
Ein paar Sachen:
Da in Programmiersprachen häufig auf Wiederverwendbarkeit und Übersichtlichkeit gesetzt wird, solltest du:
- Z. 164 - 174 in einer doppelten for-Schleife Zusammenfassen
- die AnzeigePanels für Kreis/Kreuz vllt. extra von JPanel ableiten, damit sie zusätzlich noch automatisch ihren Inhalt ändern
- Zeilen wie 294 - 298 in einer Methode zusammenfassen

Zum Einen macht das den Code für dich übersichtlicher (und auch für Andere) und es wird einfacher zu verstehen.


Meine Idee zu deinem Problem ist, dass du den TimerTask public machst und dann, wenn gedrückt wurde, sofort "brutal" abbrichst, sodass du keinesfalls noch ein Kreuzchen zuviel siehst (Natürlich alles per InterruptedException abfangen)

Gruß eMmiE
 

BlunatiX

Mitglied
Hallo eMmiE,
danke für deine Tipps! Ich werde mich gleich mal an die Arbeit machen.
Nur noch schnell eine Frage:
Mit gelcher Methode würdest du das brutale Abbrechen realisieren?
 

eMmiE

Bekanntes Mitglied
Ich weiß nicht, ob TimerTask auch so etwas hat, wie Thread, aber bei Thread würde ich das mithilfe von interrupt() machen...
google einfach mal

Gruß eMmiE
 

BlunatiX

Mitglied
Super Lösung ist gefunden:
Der Befehl ist cancel() auf den TimerTask und dann muss der Timer noch neu initialisiert werden.
Vom Prinzip her sieht das dann so aus:
Java:
import java.util.Timer;
import java.util.TimerTask;

public class Main {
    Timer timer;
    TimerTask timerTask;

    public static void main(String[] args) {
        StartCancelNeustart();
    }

    public void MyTimer() {
        timerTask = new TimerTask() {

            @Override
            public void run() {
                //Hier steht, was auch immer der Timer tun soll.
            }
        };
        timer = new Timer();
        timer.schedule(timerTask, 0, 1000);

    }

    //Aus dieser Methode wird der TimerTask gestartet, der Timer beendet und der Timer wieder neu 
    //initialisiert, um dann den TimerTask wieder neu starten zu können.
    public void StartCancelNeustart() {
        timerTask();

        timer.cancel();
        timer = new Timer();

        timerTask();
    }
}

Ich hoffe das hilft dem ein oder anderen auch noch weiter. ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
M 2D-Grafik timer bei Analoguhr AWT, Swing, JavaFX & SWT 2
A Timer AWT, Swing, JavaFX & SWT 1
H Timer ohne alles lahmzulegen? AWT, Swing, JavaFX & SWT 2
O Timer in JOptionPane anzeigen AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
M Event Handling MousePressed vs. Timer! AWT, Swing, JavaFX & SWT 5
F Java Timer Bug? AWT, Swing, JavaFX & SWT 6
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
E Problem mit Timer und Swing AWT, Swing, JavaFX & SWT 8
N AWT Timer überschreiben? AWT, Swing, JavaFX & SWT 8
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
K Threads - Timer - run() mehrfach parallel? AWT, Swing, JavaFX & SWT 2
J Nach Timer ausführen AWT, Swing, JavaFX & SWT 6
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
D Timer JFrame AWT, Swing, JavaFX & SWT 7
F Swing timer nimmt delay nicht an AWT, Swing, JavaFX & SWT 2
S Swing Timer, Countdown AWT, Swing, JavaFX & SWT 2
F Timer welches JPanel aktualisiert AWT, Swing, JavaFX & SWT 6
H Timer/Stoppuhr in MenuBar anzeigen AWT, Swing, JavaFX & SWT 4
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
F Applet Applet starten...(+Timer?) AWT, Swing, JavaFX & SWT 12
R Probleme mit Swing Timer AWT, Swing, JavaFX & SWT 6
C Timer Problem AWT, Swing, JavaFX & SWT 5
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
H Swing Timer Probleme AWT, Swing, JavaFX & SWT 5
Burny91 Swing Mit Timer JLabel updaten AWT, Swing, JavaFX & SWT 2
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B JLabel mittels Timer und setLocation verschieben AWT, Swing, JavaFX & SWT 3
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
C Timer erstellen? AWT, Swing, JavaFX & SWT 2
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
K Timer und Threads ruckeln für Fotoschwenk AWT, Swing, JavaFX & SWT 3
L Timer Swing GUI AWT, Swing, JavaFX & SWT 2
G Swing Timer stoppen AWT, Swing, JavaFX & SWT 4
B Swing-Timer AWT, Swing, JavaFX & SWT 4
D javax.swing.Timer bringt NullPointerException AWT, Swing, JavaFX & SWT 4
J Swing timer? AWT, Swing, JavaFX & SWT 2
C Timer, Darstellung einer Uhr AWT, Swing, JavaFX & SWT 4
Z javax.swing.Timer: wie stoppen??? AWT, Swing, JavaFX & SWT 9
S Swing TimerTask Meeting Kosten AWT, Swing, JavaFX & SWT 6
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
G FX warten bis ein anderes GUI Element ausgewählt wurde AWT, Swing, JavaFX & SWT 8
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
kodela Swing Anzeige des Warten-Cursors AWT, Swing, JavaFX & SWT 8
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
W JavaFX Webview warten bis Seite geladen geladen ? AWT, Swing, JavaFX & SWT 0
U Java FX Warten auf Textfield eingabe AWT, Swing, JavaFX & SWT 17
M JavaFX FadeTransition, warten bis beendet AWT, Swing, JavaFX & SWT 10
O Swing JDialog öffnen und dann warten bis er geschlossen wurde AWT, Swing, JavaFX & SWT 2
H Event Handling JavaFx - auf Event warten AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
D Swing Bei MenuSelectionManager auf Ausführung warten? AWT, Swing, JavaFX & SWT 5
gamebreiti auf usereingabe warten mit GUI(nur Labels, Buttons etc. keine Texteingaben) AWT, Swing, JavaFX & SWT 3
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
H AWT Auf Bestätigung warten AWT, Swing, JavaFX & SWT 6
L JavaFX Wait/Sleep/postedDelay - Einfach nur warten AWT, Swing, JavaFX & SWT 4
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
F JFrame nach Buttonklick 3 Sekunden warten, bevor es sich ändert AWT, Swing, JavaFX & SWT 2
C Schleife auf Mausklick warten lassen AWT, Swing, JavaFX & SWT 6
A Auf Tastendruck warten AWT, Swing, JavaFX & SWT 9
A Auf eingabe warten AWT, Swing, JavaFX & SWT 5
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
B Warten bis neues ImageIcon zugewiesen ist AWT, Swing, JavaFX & SWT 3
S Swing Bild (Gif) in Bitte warten JDialog AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
M Hauptprogramm pausieren und auf Ergebnis eines JDialogs warten AWT, Swing, JavaFX & SWT 7
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
A Swing Warten bis JDialog fertig AWT, Swing, JavaFX & SWT 3
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
pinerski Swing Frame 1 soll auf Frame 2 warten AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
R JDialog "Bitte warten..." durchsichtig AWT, Swing, JavaFX & SWT 5
G JTable warten bis Spalte verschoben wurde AWT, Swing, JavaFX & SWT 2
C Warten auf Rückgabewert im EventDispatchingThread AWT, Swing, JavaFX & SWT 8
A Bitte warten Dialog AWT, Swing, JavaFX & SWT 4
G Auf Ergebnis vom Thread warten AWT, Swing, JavaFX & SWT 3
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
R Warten auf Ergebnisse eines untergeordneten JFrame AWT, Swing, JavaFX & SWT 2
C Auf Ereignis warten AWT, Swing, JavaFX & SWT 7
L Warten, aber trotzdem "lebende" UI AWT, Swing, JavaFX & SWT 2
K Textfeld Programm soll auf Eingabe warten! AWT, Swing, JavaFX & SWT 4
B Auf Frame/Dialog warten AWT, Swing, JavaFX & SWT 2
A Programmunterbrechung und warten auf Benutzereingabe AWT, Swing, JavaFX & SWT 6
J Warten auf einen Dialog? AWT, Swing, JavaFX & SWT 2
J Programm warten, bis GUI geschlossen ist AWT, Swing, JavaFX & SWT 4
F Auf Thread warten ohne alles andere zu blockieren AWT, Swing, JavaFX & SWT 5
W Auf eine Eingabe warten? AWT, Swing, JavaFX & SWT 2
N malen => 1 Sekunde warten => malen AWT, Swing, JavaFX & SWT 2
m@nu Dialog während warten anzeigen AWT, Swing, JavaFX & SWT 3
U Auf Swings Reaktion warten AWT, Swing, JavaFX & SWT 3
C JFrame warten lassen AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben