Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode

M

MichaelAnfänger

Gast
Hi,

wir sollen in unserem Semester ein Memory-Spiel programmieren, und sind dabei auf ein Problem gestoßen, das wir auch nach mehreren Stunden nicht lösen konnten. Ehrlich gesagt, habe ich das selbe Problem schon mehrfach hier im Forum gefunden, es aber nicht geschafft, die angebotenen Lösungen zu verstehen, bzw. umzusetzen. Es geht darum, dass, nachdem zwei nicht zusammengehörende Karten geöffnet wurden, diese nach einer kurzen Wartezeit wieder zugedeckt werden. Auftretendes Problem ist halt, dass die letzte der beiden geöffneten Karten erst garnicht angezeigt wird, da beide schon vorher wieder zugedeckt werden. Ich habe hier mal, die wie ich denke, relevanten Code-Teile hinzugefügt. Die Memory-Karten sind auf Buttons angezeigte Icons, die actionPerformed-methode gehört daher ebenfalls zu diesen Buttons:

Java:
	public void pause()
	{
		try
		{
			Thread.sleep(5000);
		}
		catch (Exception e)
		{
			
		}
	}

	public void setCardBlind()
	{
		buttonCardOne.setIcon(ico);
		buttonCardTwo.setIcon(ico);
	}

private class SwingAction_3 extends AbstractAction {
		public SwingAction_3() {
			putValue(NAME, "");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) 
		{
			setActiveElement(e);
			allCards.get(activeElement).setOpened(true);
			
			ImageIcon ico = new ImageIcon(allCards.get(activeElement).getPath());
			ico.setImage(ico.getImage().getScaledInstance(100,100,Image.SCALE_DEFAULT)); 
			
			((AbstractButton) e.getSource()).setIcon(ico);
					
			if (alreadyClicked == false)
			{
				CardOne = allCards.get(activeElement);
				buttonCardOne = (JButton) e.getSource();
				alreadyClicked = true;
			}
			else
			{
				CardTwo = allCards.get(activeElement);
				buttonCardTwo = (JButton) e.getSource();
				alreadyClicked = false;
				
				if (CardOne.getID() == CardTwo.getIdenticCardID())
				{
					currPlayer.setPoints(1);
					lbl2.setText("Punktzahl: " + String.valueOf(currPlayer.getPoints()));
					CardOne.setOpened(true);
					CardTwo.setOpened(true);	
				}
				else
				{
					currPlayer = currPlayer.getFollowingPlayer();
					lbl1.setText("Aktueller Spieler: " + String.valueOf(currPlayer.getID()));
					lbl2.setText("Punktzahl: " + String.valueOf(currPlayer.getPoints()));
					CardOne.setOpened(false);
					CardTwo.setOpened(false);
pause();
					setCardBlind();
				}
			}
		}

Ich hoffe das ist halbwegs übersichtlich und das mir das jemand für totale Anfänger erklären kann.

Freundliche Grüße
Michael
 
M

MichaelAnfänger

Gast
Der gesamte Code sähe so aus, da sieht man auch wo pause() genau liegt, falls es das ist was du meinsest:

Java:
public class Memory{

	private JFrame frame;
	private final Action pushStart = new SwingAction();
	private final Action setPlayer1 = new SwingAction_1();
	private final Action setPlayer2 = new SwingAction_2();
	JButton btn1;
	JButton btn2;
	JButton btn3;
	JButton btn4;
	JLabel lbl1;
	JLabel lbl2;
	int numberOfPlayers = 1;
	Card c = new Card();
	Player pl1;
	Player pl2;
	Player currPlayer;
	Card CardOne = null;
	Card CardTwo = null;
	JButton buttonCardOne;
	JButton buttonCardTwo;
	ImageIcon ico;
	ArrayList<Card> allCards = new ArrayList<Card>();
	boolean alreadyClicked = false;
	int activeElement;
	private final Action action = new SwingAction_3();
	private static boolean istPause = false;


	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Memory window = new Memory();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Memory() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setResizable(false);
		frame.setBounds(100, 100, 915, 552);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);
		
		JMenu mnDatei = new JMenu("Datei");
		menuBar.add(mnDatei);
		
		JMenuItem mntmSpielBeginnen = new JMenuItem("Spiel beginnen");
		mntmSpielBeginnen.setAction(pushStart);
		mnDatei.add(mntmSpielBeginnen);
		
		JMenu mnAnzahlSpieler = new JMenu("Anzahl Spieler");
		mnDatei.add(mnAnzahlSpieler);
		
		JMenuItem mntmSpieler = new JMenuItem("1 Spieler");
		mntmSpieler.setAction(setPlayer1);
		mnAnzahlSpieler.add(mntmSpieler);
		
		JMenuItem mntmSpieler_1 = new JMenuItem("2 Spieler");
		mntmSpieler_1.setAction(setPlayer2);
		mnAnzahlSpieler.add(mntmSpieler_1);
		
		JMenu mnHilfe = new JMenu("Hilfe");
		menuBar.add(mnHilfe);
		frame.getContentPane().setLayout(null);
		
		btn1 = new JButton("");
		btn1.setAction(action);
		
		btn1.setBounds(10, 11, 100, 100);
		frame.getContentPane().add(btn1);
		
		btn2 = new JButton("");
		btn2.setAction(action);
		btn2.setBounds(120, 11, 100, 100);
		frame.getContentPane().add(btn2);
		
		btn3 = new JButton("");
		btn3.setAction(action);
		btn3.setBounds(230, 11, 100, 100);
		frame.getContentPane().add(btn3);
		
		btn4 = new JButton("");
		btn4.setAction(action);
		btn4.setBounds(340, 11, 100, 100);
		frame.getContentPane().add(btn4);
		
		lbl1 = new JLabel("Aktueller Spieler: 1");
		lbl1.setBounds(10, 478, 116, 14);
		frame.getContentPane().add(lbl1);
		
		lbl2 = new JLabel("Punktzahl: 0");
		lbl2.setBounds(136, 478, 85, 14);
		frame.getContentPane().add(lbl2);
		
		setVisiblity(false);
	}
	
	public void setActiveElement(ActionEvent evt)
	{
		if (evt.getSource() == btn1)
		{
			activeElement = 0;
		}
		else if (evt.getSource() == btn2)
		{
			activeElement = 1;
		}
		else if (evt.getSource() == btn3)
		{
			activeElement = 2;
		}
		else if (evt.getSource() == btn4)
		{
			activeElement = 3;
		}
	}
	
	
	// Setzen der Sichtbarkeit der Buttons
	public void setVisiblity(boolean visible)
	{
		btn1.setVisible(visible);
		btn2.setVisible(visible);
		btn3.setVisible(visible);
		btn4.setVisible(visible);
		lbl1.setVisible(visible);
		lbl2.setVisible(visible);
	}
	
	public void initiateGame(int Players)
	{
		createPlayers(Players);
		createCards();
	}
	
	public void createPlayers(int Players)
	{
		switch (Players)
		{
		case 1:
			pl1 = new Player(1);
			pl1.setFollowingPlayer(pl1);
			break;
		case 2:
			pl1 = new Player(1);
			pl2 = new Player(2);
			pl1.setFollowingPlayer(pl2);
			pl2.setFollowingPlayer(pl1);
			break;
		}
		currPlayer = pl1;
	}
	
	public void createCards()
	{
		allCards.clear();
		
		Card cd1 = new Card(1, "C:\\Jellyfish.jpg", 2);
		Card cd2 = new Card(2, "C:\\Jellyfish.jpg", 1);
		Card cd3 = new Card(3, "C:\\Desert.jpg", 4);
		Card cd4 = new Card(4, "C:\\Desert.jpg", 3);
		
		allCards.add(cd1);
		allCards.add(cd2);
		allCards.add(cd3);
		allCards.add(cd4);
		
		Collections.shuffle(allCards);
	}
	
	public void setStartingImage()
	{
		//Card c = new Card();
		ico = new ImageIcon("C:\\Chrysanthemum.jpg");
		ico.setImage(ico.getImage().getScaledInstance(100,100,Image.SCALE_DEFAULT)); 
		
		btn1.setIcon(ico);
		btn2.setIcon(ico);
		btn3.setIcon(ico);
		btn4.setIcon(ico);
	}
	
	public void setCardBlind()
	{
		buttonCardOne.setIcon(ico);
		buttonCardTwo.setIcon(ico);
	}
	
	public void pause()
	{
		try
		{
			Thread.sleep(5000);
		}
		catch (Exception e)
		{
			
		}
	}
	
	
	private class SwingAction extends AbstractAction {
		public SwingAction() {
			putValue(NAME, "Spiel beginnen");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) 
		{
			activeElement = 0;
			setStartingImage();
			setVisiblity(true);
			initiateGame(numberOfPlayers);
		}
	}
	
	private class SwingAction_1 extends AbstractAction {
		public SwingAction_1() {
			putValue(NAME, "1 Spieler");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) 
		{
			numberOfPlayers = 1;
		}
	}
	
	private class SwingAction_2 extends AbstractAction {
		public SwingAction_2() {
			putValue(NAME, "2 Spieler");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) 
		{
			numberOfPlayers = 2;
		}
	}
	
	private class SwingAction_3 extends AbstractAction {
		public SwingAction_3() {
			putValue(NAME, "");
			putValue(SHORT_DESCRIPTION, "Some short description");
		}
		public void actionPerformed(ActionEvent e) 
		{
			setActiveElement(e);
			allCards.get(activeElement).setOpened(true);
			
			ImageIcon ico = new ImageIcon(allCards.get(activeElement).getPath());
			ico.setImage(ico.getImage().getScaledInstance(100,100,Image.SCALE_DEFAULT)); 
			
			((AbstractButton) e.getSource()).setIcon(ico);
					
			if (alreadyClicked == false)
			{
				CardOne = allCards.get(activeElement);
				buttonCardOne = (JButton) e.getSource();
				alreadyClicked = true;
			}
			else
			{
				CardTwo = allCards.get(activeElement);
				buttonCardTwo = (JButton) e.getSource();
				alreadyClicked = false;
				
				if (CardOne.getID() == CardTwo.getIdenticCardID())
				{
					currPlayer.setPoints(1);
					lbl2.setText("Punktzahl: " + String.valueOf(currPlayer.getPoints()));
					CardOne.setOpened(true);
					CardTwo.setOpened(true);	
				}
				else
				{
					currPlayer = currPlayer.getFollowingPlayer();
					lbl1.setText("Aktueller Spieler: " + String.valueOf(currPlayer.getID()));
					lbl2.setText("Punktzahl: " + String.valueOf(currPlayer.getPoints()));
					CardOne.setOpened(false);
					CardTwo.setOpened(false);
					setCardBlind();
				}
			}
		}
	}
}

Ja, die GUI wird mehr oder weniger blockiert, zumindest wird der Code nicht so abgearbeitet, wie ich das erwarten würde. Hat was mit den Threads zu tun, so viel hab ich noch verstanden, da läuft wohl noch einer automatisch im Hintergrund, der da in die Quere kommt, und zum Problem führt.
 

Stefan0001

Mitglied
naja soweit ich weiß läuft awt events über eine queue

also es gibt einen prozess der die ganzen events abarbeitet
wenn du nun einen große arbeit in das event packst, kann sich der prozess nicht mehr um die anderen events kümmern
-> in deinem fall wäre die große arbeit der pause prozess

um das problem zu umgehen sollte man größere arbeiten in einem externen thread laufen lassen.



Das ganze mal in einem Beispiel.

10 Menschen stehen vor einer Tür in einer Warteschlange.
Die Warteschlange wäre in java die EventQueue
So nun ist der nächste Mensch dran, welcher aber sehr übergewichtig ist.
Nun blockiert er die ganzen anderen Menschen die noch in der Warteschlange stehen.

Um das Problem zu lösen eröffnest du einfach eine 2te Tür und schickst den Blocker durch die andere Tür.


Steht auch in "JAva ist auch eine Insel"
Galileo Computing :: Java ist auch eine Insel – 19.26 AWT, Swing und die Threads
punkt 19.26

Das wars eigentlich

mfg
 
Zuletzt bearbeitet:
M

MichaelAnfänger

Gast
Danke für die Hilfe, wir haben es jetzt lösen können.

Freundliche Grüße

Michael Behnke
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
G problem mit thread.sleep() Java Basics - Anfänger-Themen 6
G Problem mit Thread Sleep! Java Basics - Anfänger-Themen 3
E Anfänger Problem mit Thread.sleep() Java Basics - Anfänger-Themen 11
F Thread.sleep() Java Basics - Anfänger-Themen 5
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
P Threads Thread.sleep() Java Basics - Anfänger-Themen 7
M Fehler bei Thread.sleep() Java Basics - Anfänger-Themen 5
B Thread.sleep() Java Basics - Anfänger-Themen 1
C Thread.sleep ratsam? Java Basics - Anfänger-Themen 6
L Thread.sleep Java Basics - Anfänger-Themen 6
T Thread Sleep() Java Basics - Anfänger-Themen 4
J Thread.sleep Java Basics - Anfänger-Themen 7
A Thread.sleep() unterbrechen? Java Basics - Anfänger-Themen 3
S Thread.sleep () - Frage Java Basics - Anfänger-Themen 16
M Frage zur Methode Thread.sleep() Java Basics - Anfänger-Themen 6
O Memory Thread.sleep() Java Basics - Anfänger-Themen 5
S Thread.sleep i.V.m Button.setText() Java Basics - Anfänger-Themen 8
G Schleife mit Thread.sleep pausieren Java Basics - Anfänger-Themen 12
R Thread - sleep - interrupt Java Basics - Anfänger-Themen 18
M Thread.sleep(20) dauert 31ms ? Java Basics - Anfänger-Themen 7
S Thread.sleep Java Basics - Anfänger-Themen 6
V Alternative zu Thread.sleep() ? Java Basics - Anfänger-Themen 6
S Runtime.exec -> Thread.sleep -> Konflikt Java Basics - Anfänger-Themen 7
A Thread.sleep Java Basics - Anfänger-Themen 9
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben