Anzeige der Benutzeroberfläche verzögern

Status
Nicht offen für weitere Antworten.

sabsoe

Mitglied
Hallo zusammen!
Ich hoffe mir kann jemand weiterhelfen - ich selbst weiss leider nicht mehr wo ich noch suchen soll...

Ich schreibe derzeit ein Spiel bei dem sowohl menschliche als auch Computergegner spielen können.
Bei den menschlichen Spielern wartet das Programm auf die Eingaben des Benutzers - solange wird die Benutzeroberfläche angezeigt. (es handelt sich um ein Kartenspiel - die Handkarten des Benutzers, die Tischkarten und die Auswahlkarten werden visuell dargestellt)

Mein Problem liegt bei den Computergegnern. Dort muss nicht auf eine Eingabe gewartet werden sondern der Rechner ruft Methoden auf die das erledigen. Die Anzeige der Karten funktioniert zwar - ist aber so schnell dass man das leider nicht wahrnehmen kann. Ich habe bereits versucht das ganze mit Thread.sleep() irgendwie hinauszuzögern. Das geht aber leider nicht - da nicht an der entsprechenden Aufrufstelle von Thread.sleep() gewartet wird sondern erst dann wenn der nächste menschliche Spieler an der Reihe ist.

Ich bin noch recht neu in der Java-Programmierung und hoffe dass irgendwer eine Idee hat wie ich das Problem lösen könnte.

Vielen Dank im Voraus,

Sabrina
 

sabsoe

Mitglied
Code:
/**
 * steuert das Verhalten des Computergegners beim
 * Spielablauf
 */
public void startKI(){
	// der Computer wählt eine Ausspielkarte mit Hilfe der
	// Methode naechsteKarte die durch das Interface Spieltaktik
	// in den Klassen Leicht, Mittel und Schwer implementiert wird
	Rechner rechner = (Rechner)Controle.getData().getSpieler(nextSpieler);
	int spielKarte = rechner.getTaktik().naechtsteKarte(nextSpieler);
	doEvent04b(spielKarte);
}


public void actionPerformed(ActionEvent arg0) {


	...	
		
		
	// ********************************************************************
	// EVENT 04: Der Spieler hat eine Handkarte ausgewählt per Buttonklick
	// ********************************************************************
	if (arg0.getActionCommand().toString().trim().endsWith("Handkarte") && 
                       arg0.getActionCommand().toString().trim().substring(4,11).equals("Spieler")){
			
	    doEvent04a(Integer.parseInt(arg0.getActionCommand().trim().substring(0,1)));
			
	}


                ....
}

public void doEvent04a(int acSubString){
	// wird aus actionPerformed() aufgerufen
	// nextSpieler = menschliche Spieler:
	if(Controle.getData().getSpieler(nextSpieler).getGattung().equals("Mensch")){
		if(Controle.getData().getSpieler(nextSpieler).getAusspielKarte() == null){
			// auf die Kartenauswahl soll nur reagiert werden wenn der Spieler
			// noch keine Ausspielkarte ausgewählt hat
			karteZiehen(acSubString);
			
			//-----------------------------------------------------
			// Möglichkeit 1:  jeder Spieler hat eine Karte gewählt
			//-----------------------------------------------------
			if ((pAuswahlkarten.getComponentCount()-1) == Controle.getData().getAnzSpieler
                                                    () && !weiterPushed && !spielEnde){
				actionEachPlayerHas();
			}
			
			//--------------------------------------------------------
			// Möglichkeit 2: noch nicht alle Spieler haben eine Karte
			//                ausgewählt
			//--------------------------------------------------------
			if ((pAuswahlkarten.getComponentCount()-1) < Controle.getData().getAnzSpieler() 
                                                    && !weiterPushed && !spielEnde){
				getNextSpieler();
			}
		}
	}
}

	
public void doEvent04b(int acSubString){
                // wird aus startKI() aufgerufen
	// nextSpieler = Computergegner:
	if(Controle.getData().getSpieler(nextSpieler).getGattung().equals("Rechner")){
	
		karteZiehen(acSubString);
		
		//-----------------------------------------------------
		// Möglichkeit 1:  jeder Spieler hat eine Karte gewählt
		//-----------------------------------------------------
		if (((pAuswahlkarten.getComponentCount()-1) == Controle.getData().getAnzSpieler()) && 
                                    !weiterPushed && !spielEnde){
			actionEachPlayerHas();
		}
		//--------------------------------------------------------
		// Möglichkeit 2: noch nicht alle Spieler haben eine Karte
		//                ausgewählt
		//--------------------------------------------------------
		if ((pAuswahlkarten.getComponentCount()-1) < Controle.getData().getAnzSpieler() && 
                                    !weiterPushed && !spielEnde){
			getNextSpieler();
		}
	}
}

So ich weiss nicht ob das jetzt weiterhilft (man möge mir schlechten Programmierstil nachsehen - ist mein erstes Projekt) :roll:

beim Aufruf von getNextSpieler() wird die Benutzeroberfläche neu gezeichnet mit den Karten des Spielers der gerade an der Reihe ist.
Meine Idee war jetzt - da ja nach getNextSpieler() bei menschlichen Spielern darauf gewartet wird das ein ActionEvent auftritt einfach den Computergegner ein bischen warten zu lassen bevor er eine Karte auswählt - damit der Betrachter des Spiels eine Chance hat die Karten des Computers einzusehen und so dessen Spieltaktik verfolgen zu können.
Deshalb wollte ich bevor aus startKI() heraus doEvent04() aufgerufen wird einfach Thread.sleep(1000) oder so einbauen. Das funktionierte aber leider nicht.
 

thE_29

Top Contributor
Mhm...


Weißt du bei getNextSpieler schon ob es sich um Computer oder einen Mensch handelt??

Wie wärs mit dort drinnen zu warten!


Problem könnte sein, das deine GUI einfriert (was es wahrscheinlich tun wird)

Daher, müsstest du multiThreading (also für den CPU Gegnen nen eigenen Thread erzeugen)
 

sabsoe

Mitglied
Code:
/**
 * wählt den nächsten Spieler aus und legt dessen
 * Karten in pSpielerKarten aus
 */
public void getNextSpieler(){
	// ... nächsten Spieler ermitteln
	setNextSpieler();

	// Handkarten des Spielers im Panel pSpielerkarten anzeigen
	pSpielerkarten.removeAll();
	getBtnSpielerKarten(nextSpieler);
	pSpielerkarten.repaint();

	this.requestFocus();

	// der nächste Spieler ist ein Computergegner ...
	if(Controle.getData().getSpieler(nextSpieler).getGattung().equals("Rechner")){
		// ... dann starte KI ...

                                // Thread.sleep(1000);  ????

		startKI();
	}
}

das ist die Methode getNextSpieler(). Hier ist schon bekannt um welchen Spieler es sich handelt und ich dachte vor startKI() könnte ich Thread.sleep() verwenden.
Dass der Bildschirm einfriert wäre ja nicht das Problem - sondern in dem Fall ja gewollt - aber das Problem ist wenn ich es hier an der Stelle versuche passiert es erst viel später nämlich beim nächsten menschlichen Gegner (im Falle dass Rechner gegen Mensch spielt).
Es scheint als würde das Programm einfach weiterlaufen und das sleep erst ausführen nachdem ein BenutzerEvent aufgetreten ist.
Und das würde ich gerne irgendwie verhindern aber ich weiss nicht wie.
Gibt es nicht eine Möglichkeit das ohne Multithreading zu realisieren?
Wenn nein gibt es vielleicht eine gute Seite im Netz dazu wo ich mir etwas darüber anlesen kann oder gute Beispiele?
 

thE_29

Top Contributor
Also, wenn du dort ein Thread.currentThread().sleep(5000) machst, sollte er dort 5 sekunden warten (try/catch BLock fehlt noch)

Probier mal länger als 1 sekunde und schau obs geht..

Der sollte erst nach dem Sleep das startKI() ausführen!
 

sabsoe

Mitglied
Ich habs grade mal ausprobiert aber hat leider wieder nicht funktioniert.
Er wartet aber nicht an der entsprechenden Stelle sondern wieder erst nachdem ein Event vom menschlichen Gegner ausgelöst wurde. Das bedeutet also dass ich dann in dem Moment die Karten des menschlichen Spielers einsehen kann - aber über die Anzeige der Karten des Computers hudelt er einfach drüber. Die werden aber angezeigt - wenn ich mir z.B. ne DialogBox an der selben Stelle hochpoppen lasse dann sehe ich die Karten des Rechners.
 

thE_29

Top Contributor
Eben!

Das ist das Problem!

Deine GUI friert ein!!

Probier mal das hier (statt dem normalen startKI());


Code:
new Thread(){
public void run(){
try{
Thread.currentThread().sleep(5000);
startKI();
}
catch(Exception ex)
{ ex.printStackTrace(); }
}
}.start();

Das ist ein neuer Thread..


Dh, dein Programm läuft "ins Leere" da dort keine Methode steht und der 2te Thread (hier ein anomyer Thread) schläft 5 Sek und führt dann wieder was aus!


Problem bei Swing ist, das wenn man ein Thread.sleep macht, er die komplette GUI "einfriert" da Swing net Threadsicher ist!

Probier das mal und sag ob das ging..


Weil ein modaler Dialog, friert nix ein.. Daher siehst du dort die Karten.. also denke ich, dass das das Problem ist.
 

sabsoe

Mitglied
Super gut!!!
Vielen vielen Dank! Das klappt!

:D

Muss ich den Thread auch wieder beenden irgendwann oder geschieht das von alleine?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Anzeige ID und Markierung für Knoten in Eclipse & Swing AWT, Swing, JavaFX & SWT 4
hannibalstgt Fehler bei JCOMBOBOX GUI Anzeige AWT, Swing, JavaFX & SWT 4
M suche geeignetes Fenster zur Anzeige AWT, Swing, JavaFX & SWT 49
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
kodela Swing Anzeige des Warten-Cursors AWT, Swing, JavaFX & SWT 8
kodela Verspätete Anzeige in Textfeldern AWT, Swing, JavaFX & SWT 8
F BorderLayout Hilfe bei Anzeige AWT, Swing, JavaFX & SWT 2
L Java FX Keine Anzeige Im Tableview AWT, Swing, JavaFX & SWT 4
F JScrollPane anzeige AWT, Swing, JavaFX & SWT 7
F Design-Anzeige im Windowbuilder AWT, Swing, JavaFX & SWT 3
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
D JavaFX Control zur Anzeige von eBooks AWT, Swing, JavaFX & SWT 5
javampir Swing Anzeige der FileFilter im JFileChooser AWT, Swing, JavaFX & SWT 0
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
G JScrollPane bricht am Ende der Anzeige nicht um AWT, Swing, JavaFX & SWT 2
V JWindow: Falsche Anzeige auf Ubuntu AWT, Swing, JavaFX & SWT 2
N JDialog als Progress-Anzeige AWT, Swing, JavaFX & SWT 6
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
A JFreeChart BarChart invertierte anzeige oder werte bereich von-bis AWT, Swing, JavaFX & SWT 4
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
P Swing Problem mit der Anzeige AWT, Swing, JavaFX & SWT 12
B SWT TreeViewer dynamische Anzeige von Icons AWT, Swing, JavaFX & SWT 3
M Anzeige updatet sich erst am Ende des Programms AWT, Swing, JavaFX & SWT 3
J JList, Anzeige aktualisieren AWT, Swing, JavaFX & SWT 7
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
A Swing JFileChooser - Anzeige in Echtzeit filtern AWT, Swing, JavaFX & SWT 10
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
A Swing Anzeige Text in JScrollpane AWT, Swing, JavaFX & SWT 8
M TabbpedPane Anzeige aktualisieren AWT, Swing, JavaFX & SWT 6
S Anzeige von Beschleunigungswerten AWT, Swing, JavaFX & SWT 2
S Anzeige eines JWindows AWT, Swing, JavaFX & SWT 3
N jcomboBox anderer Wert als Anzeige AWT, Swing, JavaFX & SWT 6
B Swing Java crashed nach Anzeige JOptionePane AWT, Swing, JavaFX & SWT 20
S Probleme mit Anzeige von JComboBox AWT, Swing, JavaFX & SWT 2
J Anzeige AWT, Swing, JavaFX & SWT 5
F Verzögerung bei der ersten Anzeige AWT, Swing, JavaFX & SWT 6
timbeau Gitter in Sudoko-Anzeige AWT, Swing, JavaFX & SWT 9
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
D Swing Anzeige während eines Ladevorganges AWT, Swing, JavaFX & SWT 6
N Eigener Grafik Editor mit fehlerhafter Anzeige AWT, Swing, JavaFX & SWT 4
C SWT SWT Browser anzeige bug AWT, Swing, JavaFX & SWT 3
A Einschreiten vor anzeige eines Frames AWT, Swing, JavaFX & SWT 26
P JTree - Explorer mit nur eingeschränkter Anzeige AWT, Swing, JavaFX & SWT 17
J Verzögerung bei Änderungen der Anzeige abwarten AWT, Swing, JavaFX & SWT 5
T SWT Keine Anzeige der Widgets nach Comboauswahl AWT, Swing, JavaFX & SWT 2
M.F.G. Fehler bei der Anzeige Grafischer Elemente AWT, Swing, JavaFX & SWT 13
B SWT Textdatei Lesen und Anzeige in View - Zeichensatzproblem AWT, Swing, JavaFX & SWT 4
hdi JTree: interne Daten OK, Anzeige schwarze Magie AWT, Swing, JavaFX & SWT 2
R Anzeige der Aktivität AWT, Swing, JavaFX & SWT 3
S Splash Screen / "Loading" Anzeige im Programm AWT, Swing, JavaFX & SWT 27
S JTree - Anzeige des Knotennamen ändern AWT, Swing, JavaFX & SWT 2
B JList Anzeige aktualisieren (Models) AWT, Swing, JavaFX & SWT 2
G Keine Anzeige des Balkens AWT, Swing, JavaFX & SWT 3
C JTable aktualisiert die Anzeige nicht AWT, Swing, JavaFX & SWT 2
G Anzeige schwierigkeiten AWT, Swing, JavaFX & SWT 3
G Problem mit Anzeige von HTML AWT, Swing, JavaFX & SWT 5
P JRE 6 -> ToolTip & mnemonic Anzeige AWT, Swing, JavaFX & SWT 4
G JComboBox - Anzeige mit Wert verknüpfen AWT, Swing, JavaFX & SWT 3
G Anzeige Problem AWT, Swing, JavaFX & SWT 4
D Anzeige eines Bildes: JPanel oder JLabel ? AWT, Swing, JavaFX & SWT 3
T dynamische anzeige? AWT, Swing, JavaFX & SWT 4
W JList Anzeige erneuern AWT, Swing, JavaFX & SWT 4
P JMenuBar und JToolBar Anzeige Probleme AWT, Swing, JavaFX & SWT 5
T JComboBox anzeige AWT, Swing, JavaFX & SWT 6
F Anzeige von JPanel AWT, Swing, JavaFX & SWT 3
M JTree und Anzeige des entsprechenden Panels AWT, Swing, JavaFX & SWT 5
K Probleme mit der Anzeige eines einzigen Nodes in einem JTree AWT, Swing, JavaFX & SWT 9
S SWT-Widgets für Anzeige-Elemente AWT, Swing, JavaFX & SWT 3
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2
M GUI mit Swing erst nach Maximieren richtige Anzeige AWT, Swing, JavaFX & SWT 2
G Anzeige von JTextField erneuern AWT, Swing, JavaFX & SWT 12
P DefaultTreeCellEditor -> Anzeige Probleme AWT, Swing, JavaFX & SWT 3
swek Flackernde Anzeige AWT, Swing, JavaFX & SWT 4
C Schweres Problem mit JDialog und Threads! Anzeige blockiert! AWT, Swing, JavaFX & SWT 5
A JTree-Anzeige filtern AWT, Swing, JavaFX & SWT 7
R Anfängerfrage:anzeige von Gui elementen AWT, Swing, JavaFX & SWT 2
W Anzeige von anderen Bildformaten: BMP, TIFF, PCX AWT, Swing, JavaFX & SWT 5
S Anzeige einer Progressbar. AWT, Swing, JavaFX & SWT 3
G Komponente zur Anzeige einer Textdatei. AWT, Swing, JavaFX & SWT 10
G JList: Anzeige von null-Werten verhindern AWT, Swing, JavaFX & SWT 3
I Problem mit korrekter Anzeige AWT, Swing, JavaFX & SWT 2
G Gibts ne Klasse zur Anzeige von Ziffern? AWT, Swing, JavaFX & SWT 4
S Anzeige-Wirrwar in JScrollbar AWT, Swing, JavaFX & SWT 3
B Anzeige eines SpinnerNumberModel AWT, Swing, JavaFX & SWT 3
C Neue Benutzeroberfläche einfügen? AWT, Swing, JavaFX & SWT 12
S Konsolenchat auf Benutzeroberfläche übertragen AWT, Swing, JavaFX & SWT 7
A Einfache Benutzeroberfläche wie realisieren? AWT, Swing, JavaFX & SWT 6
D Benutzeroberfläche, Textfelder AWT, Swing, JavaFX & SWT 6
B rohling für graphische benutzeroberfläche? AWT, Swing, JavaFX & SWT 2
S paint() verzögern AWT, Swing, JavaFX & SWT 9
M Swing Ausgabe in JTextArea verzögern AWT, Swing, JavaFX & SWT 7
A Darstellung dauert zu lange. Wie rest verzögern? AWT, Swing, JavaFX & SWT 7
P 1 Sekunde verzögern bis nächstes Befehl ausgeführt wird! AWT, Swing, JavaFX & SWT 2
M Mausklick verzögern AWT, Swing, JavaFX & SWT 5
T Anzeigegeschwindigkeit verzögern AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben