Auf Mouselistener warten?!

E

elGrapadura

Gast
Moin,

ich habe eine Funktion, die aus einer anderen Klasse aufgerufen wird:

Java:
public Move getMoveFromMouseInput() {
		
		// TODO Hier muss ein Move-Objekt aus zwei Mausklicks generiert werden.

return new Move(<Mouskoordinaten 1.Klick>, <Mousekoordinaten 2.Klick>)

Ich möchte gern, dass die Funktion wartet, bis zwei Mausklicks gemacht wurden. Wenn diese gemacht wurden, sollen die koordinaten zurückgegeben werden (Umwandlung von Mouseevent nach Koordinaten bekomme ich hin). Aber wie komme ich an die Mouseevents ran?

Ein Mouselistener wird von der Klasse mit der obigen Funktion implementiert und wurde dem sichtbaren Panel hinzugefügt.

Probleme macht mir die Reihenfolge: Direkt auf ein Mouseevent etwas ausführen kann ich, aber nicht etwas ausführen und auf den Mouselistener warten. Ich hoffe ihr könnt mir da helfen.

(Sinn: setzen eines Dame-Steins)
 

javimka

Top Contributor
Der Sinn von Events ist ja eigentlich, dass man gerade dann etwas ausführt, wenn sie auftauchen und nicht in einen Wartemodus gehen muss.

Kannst du deinem Panel nicht einen MouseListener anhängen und wenn der geklickt wurde, wird geprüft, ob zurzeit ein Stein gesetzt werden sollte und wenn icht, verlässt du die Mousepressed sofort wieder. Einen Doppelklick kannst du erkennen mit getClickCount().
 
E

elGrapadura

Gast
Das wär sozusagen die Notlösung. Wobei ich auch ungern dieses Event durch die ganze MVC-Struktur bis nach oben durchziehen würde.

Aber gewissermaßen ist das warten auf ein Event in diesem Fall schon intuitiv. Beim echten Brettspiel setzt man ja auch nur dann, wenn man dran ist. Gibts denn nicht auch ne möglichkeit, dass so zu machen wie oben gewünscht?
 

javimka

Top Contributor
"Auf einen Event warten" ist nicht intuitiv, sondern falsch.

Wenns unbedingt sein muss machst du folgendes:
Die Klasse hat ein Objekt namens lock: [c]private Objekt lock = new Object();[/c]
Wenn deine Methode nun warten soll, schreibst du
Java:
synchronized (lock) {
  lock.wait();
}

Wenn du willst, dass es weiter geht, also wenn die Events kommen, musst du schreiben:
Java:
synchronized (lock) {
  lock.notifyAll();
}

Wenn dich jemand fragt, wie du auf diesen Code gekommen bist - du hast ihn nicht von mir ;)
 
E

elGrapadura

Gast
Dankeschön, auch wenn dir diese Art von Code offenbar etwas geschmerzt hat :D
Auf jeden Fall funktionierts fürs erste.
 

Marco13

Top Contributor
Das ist nicht falsch und auch nicht schlecht - wo ist denn das Problem? :noe:

Wenn man z.B. ein zwei-Spieler-Spiel hat, und der Kern ist sowas wie
Code:
board.applyMove(activePlayer.getMove());
wie sollte dann die "getMove" Methode implementiert sein, wenn das ein Mensch mit einem GUI ist? Mit busy waiting? Ich könnte mir kaum eine sinnvolle andere Lösung vorstellen, als genau das, was javimka geschrieben hat...
 
E

elGrapadura

Gast
Moin, der Ansatz gefällt mir eigentlich schon, wenn ich micht nicht irre, ist das ja eine art monitor. Aber ab dem lock.wait() friert das Programm ein. muss ich da irgendwie noch nen neuen thread straten?

So siehts jetzt aus:


Java:
private Object lock = new Object();	
private Point p;


public Point getPoint() {
     synchronized (lock) {
          lock.wait();
     }
     return p;
}

public void mousePressed(MouseEvent arg0) {
     p = arg0.getPoint();
     synchronized (lock) {
          lock.notifyAll();
     }
}
 

javimka

Top Contributor
Aber ab dem lock.wait() friert das Programm ein
Insbesondere deswegen, ist dieser Ansatz gefährlich.

Wahrscheinlich wird die Methode getPoint() von Event-Dispatching-Thread (EDT) ausgeführt. Wenn du den anhälst, wird nichts mehr gezeichnet und es gibt keine Events mehr, weil die alle vom EDT abgearbeitet werden.
Bestimmt hast du irgendeinen Listener, der die Methode getPoint() aufruft. Das passiert dann im EDT. In disem Listener musst du einen neuen Thread starten, so dass der neue Thread getPoint aufruft und nachher damit macht, was zu tun ist.
 
E

elGrapadura

Gast
mhm, da rurf niemand außer dem Programmfluss getPoint() auf, (allerdings wird dieser zuvor per mausklick gestratet).

sollte man den mouselistener vielleicht irgendwie dazu bewegen in einem anderen thread strarten? wenn man das machen sollte, wüsste ich aber auch nicht wie.
 

javimka

Top Contributor
Der Mausklick ist ein Event. Ein Listener wird benachrichtigt. All das läuft im EDT ab. Der Listener muss nun einen neuen Thread starten, und dort drin getPoint() verweden und auch alles andere, was damit zu tun hat.

Einen Thread startest du am Einfachsten mit:
Java:
new Thread() {
  public void run() {
    ...
    ....getPoint();
    ...
  }
}.start();
 

Marco13

Top Contributor
Ja, eigentlich sollte ja der komplette Spielablauf für dieses Damespiel in einem eigenen Thread laufen... Es sollte nicht bei jedem Methodenaufruf ein neuer Thread gestartet werden, sondern nur EINmal, in der Methode, die das Spiel eben startet...
 
E

elGrapadura

Gast
danke für den hinweis. hab ich sogar gemacht, hatte es nur nich hingeschrieben, da ich nich noch mehr unnötige funktionen hinschreiben wollte. also die funktion void play(), die alles zum laufen bringt, wird nun als eigener thread gestartet.
 

javimka

Top Contributor
Schrecklich ist genau das, was passiert ist. Ein Thread wartet, der nicht warten sollte (hier der EDT). Schnell ist es passiert, dass irgendwas vergessen geht und der Thread nie wieder startet. Sei es durch einen Denkfehler des Programmierers oder eine Exception am falschen Ort vor dem notify.

Ich sage ja nicht, dass wait und notify nie zu gebrauchen seien, im Gegenteil, sie sind genial. Aber ich würde vermeiden, sie zu verwenden um auf einen Event zu warten. Wieso auf einen Event warten, wenn der Event eintritt, bemerkt man das ja sowieso.

Ich habe nun nicht den tiefen Einblick in die Archidektur des Programms, aber ich stelle mir das so vor, dass der erste Spieler einen Stein setzt, dann wird gecheckt, ob es ein korrekter Zug war und gegebenfalls der gegnerische Stein vom Feld genommen und dann ist der andere Spieler/KI dran.

Ich würde dem JPanel, das das Brett enthälft einen mouseListener/MouseMotionListener anhängen und bei einem Klick model.moveTo(stein,x,y) oder irgendsowas aufrufen. Das Model kontrolliert dann, ob der Zug gültig ist und wer nun dran ist. Das Model hat ausserdem eine Methode, wer gerade dran ist. Natürlich werden nur Züge von dem Spieler akzeptiert, der dran ist und der Listener selber könnte auch alle Klicks des Menschen ignorieren, bis er an der Reihe ist.
Angenommen, der andere Spieler ist eine KI, dann sehe ich zwei Möglichkeiten. Wenn die KI schnell genug ist, kann der Rechenvorgang im EDT gemacht werden, ansonsten muss ein separater Thread gestartet werden, damit die GUI nicht einfriert. Dann würde die KI Runnable implementieren und würde entweder vom Model direkt gestartet oder das Model wird von der KI observered und notifiziert diese dann via update. Die KI startet dann den Rechenprozess. Wenn die KI fertig ist, ruft sie auch wieder moveTo(stein,x,y) auf.

Mein Alternativbeispiel, wie ICH es machen würde. (Spielregeln sind keine implementiert und die KI ist strohdoof)
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.JApplet;
import javax.swing.JComponent;

public class JavimkasDame extends JApplet implements MouseListener {

	private int s = 64; // size of a field
	
	private Model model;
	private Man activeMan; // Gerade gewählter Stein
	
	public void init() {
		model = new Model();
		Board board = new Board(model);
		board.addMouseListener(this);
		add(board);
		setSize(s*8,s*8);
	}
	
	public void mousePressed(MouseEvent e) {
		if (!model.turn) return; // Mensch ist nicht dran
		if (activeMan!=null) activeMan.setActive(false);
		
		Man man = model.getMan(e.getX(),e.getY()); // Welcher Stein ist an Pos x,y
		if (man!=null) {
			man.setActive(true);
			activeMan = man;
		} else { // x,y ist leer
			if (activeMan!=null) { // Ist ein Stein gewählt worden
				model.moveTo(activeMan,e.getX(),e.getY());
				activeMan = null;
			}
		}
	}

	public void mouseClicked(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	
	private class Model {
		private volatile boolean turn = true; // Wer ist dran
		private Artificial ki; // KI
		private Man[] reds;
		private Man[] blue;
		private Model() {
			ki = new Artificial(this);
			reds = new Man[12];
			blue = new Man[12];
			for (int i=0;i<12;i++) {
				reds[i] = new Man(i*2%8+i/4%2,i/4,Color.RED);
				blue[i] = new Man(i*2%8+(i/4+1)%2,i/4+5,Color.BLUE);
			}
		}
		
		/**
		 * Gebe den Stein an Stelle x,y zurück, oder null, wenn das Feld leer ist
		 */
		private Man getMan(int x, int y) {
			for (Man m:reds)
				if (m.isThere(x,y)) return m;
			for (Man m:blue)
				if (m.isThere(x,y)) return m;
			return null;
		}
		
		private void moveTo(Man man, int x, int y) {
			if (isValidMove(x,y)) {
				man.setLocation(x/s*s, y/s*s);
				turn = !turn;
			}
		 	if (!turn) ki.move();
		}
		
		/**
		 * Überprüfe, ob ein neuer Stein auf x,y gesetzt werden kann
		 */
		public boolean isValidMove(int x, int y) {
			return 0<=x && x<8*s && 0<=y && y<8*s // Innerhalb des Boards
				&& (x/s+y/s)%2==0 // Feld ist schwarz
				&& getMan(x, y)==null; // Feld ist leer
		}
	}
	
	private class Artificial implements Runnable {
		
		private Model model;
		
		private Artificial(Model model) {
			this.model = model;
		}
		
		public void move() {
			new Thread(this).start();
		}
		
		public void run() {
			Man man = null;
			int x = 0;
			int y = 0;
			try {
				Thread.sleep(1000); // Berechne meinen nächsten Zug
				Random rand = new Random();
				boolean done = false;
				while(!done) {
					man = model.reds[rand.nextInt(12)];
					int xx = man.getX()+((rand.nextInt(2)==0)?-s:s); // Richtungswahl
					int yy = man.getY()+((rand.nextInt(2)==0)?-s:s);
					done = model.isValidMove(xx,yy); // true, falls xx,yy leer
					x = xx;
					y = yy;
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			} finally {
				/* 
				 * Könnte man sich überlegen, das mit SwingUtilities im EDT
				 * laufen zu lassen
				 */
				model.moveTo(man, x, y);
			}
		}
	}

	private class Board extends JComponent {
		
		public Board(Model model) {
			for (Man m:model.reds) add(m);
			for (Man m:model.blue) add(m);
		}
		
		public void paintComponent(Graphics g) {
			for (int i=0;i<8;i++) {
				for (int j=0;j<8;j++) {
					g.setColor((i+j)%2==0?Color.BLACK:Color.WHITE);
					g.fillRect(i*s,j*s,s,s);
				}
			}
		}
	}
	
	private class Man extends JComponent {
		
		private Color color; // blau oder rot
		private boolean active; // true, wenn dieser Stein gerade angewählt wurde
		
		public Man(int x, int y, Color color) {
			this.color = color;
			setLocation(x*s, y*s);
			setSize(s,s);
		}
		
		public void paintComponent(Graphics g) {
			Color col = active?Color.GREEN:color;
			g.setColor(col);
			g.fillOval(0,0,s,s);
			g.setColor(col.darker());
			g.fillOval(s/4,s/4,s/2,s/2);
		}
		
		/**
		 * Wähle den Stein aus oder ab
		 */
		private void setActive(boolean b) {
			this.active = b;
			repaint();
		}
		
		/**
		 * true, wenn sich x,y innerhalb des Steins befinden.
		 * Siehe auch contains(x,y)
		 */
		public boolean isThere(int x, int y) {
			return getX()<=x && x<getX()+getWidth() &&
				getY()<=y && y<getY()+getHeight();
		}
	}
}
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Naja, man muss nur wissen was man macht ... wenn jemand falsch programmiert, passiert eben was "schreckliches" ... entweder, dass das GUI eines Damespiels nicht mehr reagiert, oder dass die Notabschaltung eines Atomkraftwerks nicht mehr funktioniert...

Das Beispiel ist natürlich stark vereinfacht, und ein bißchen darauf "getrimmt", dass es so funktioniert, wie es soll. Bei moveTo einen neuen Thread zu starten, der selbst wieder moveTo aufruft finde ich persönlich jetzt gar nicht schön... Und natürlich würde man in der Praxis ein Zwei-Spieler-Spiel nicht so schreiben. (Eigentlich wollte ich dazu schon ewig mal ein paar Codeschnipsel posten, aber ... ZEIT... ). Man muss oder sollte ja davon ausgehen, dass man sowas hat wie

[c]interface Player { Move getMove(); }[/c]
oder meinetwegen
[c]interface Player { void doMoveOn(Board board); }[/c]

Und man dann eben einfach nicht, weiß, was man machen muss...
Java:
Player players[] = new Player[2];
int activePlayer = 0;

...

// Im eigenen Thread - nicht EDT, natürlich
while (!gameOver())
{
    Move move = players[activePlayer].getMove();
    if (isValid(move)) board.applyMove(move);
    activePlayer = 1-activePlayer;
}

Man weiß einfach nicht, ob dort zwei menschliche Spieler oder zwei KIs oder etwas gemischtes gegeneinander spielt. Man muss beide Arten gleich behandeln können. Und bei einer KI wird das "getMove" eben im Game-Thread ausgeführt, der dann halt blockiert wie er soll, und bei einem Menschlichen Spieler wird der Game-Thread so lange blockiert, bis der Mensch einen gültigen Zug gemacht hat.... :bahnhof:

Vielleicht hab' ich ja über Weihnachten mal mehr Zeit...
 

javimka

Top Contributor
So wie du es jetzt beschrieben hast, finde ich es in Ordnung. Bin gespannt auf deine Codeschnipsel :)

Dennoch mein Fazit: Das "Warten auf einen Event" würde ich versuchen zu vermeiden.
 
Zuletzt bearbeitet:

javimka

Top Contributor
Mit Events habe ich immer Swing Events gemeint, die sowieso einen Listener auslösen werden. Wenn die KI ihren Zug berechnet hat, ist das ja kein solcher Event. Sie muss dann einfach dem model irgendwie beibringen, was sie jetzt entschieden hat. Entweder mittels Rückgabewert oder einen model.moveTo Aufruf.
 

Marco13

Top Contributor
Man könnte jetzt drüber Philosophieren, wie die "Zuständigkeiten" sein sollten. Ich fände den beschriebenen Ablauf intuitiv näher liegend und schöner: Die KI läuft in einem Thread, und holt sich abwechselnd von beiden Spielern den Zug ab, den sie machen wollen - ein bißchen in Anlehung an's Hollywood Principle - Wikipedia, the free encyclopedia . Den Spielern (deren konkrete Implementierungen unbekannt sind!) die Möglichkeit zu geben, die Engine mit "Zugversuchen" zu bombardieren, und der Engine zu überlassen, ob sie mit so einem Zugversuch etwas anfangen kann, fände ich strukturell nicht so schön, und könnte auch Schwierigkeiten bergen - nicht zuletzt weil diese Zugversuche von irgendwelchen Threads aus kommen (mal vom EDT, vielleicht von einem eigenen KI-Thread...). Irgendwie finde ich halt, dass der Spielablauf da irgendwie nicht so klar ist... aber vielleicht ist das zum Teil auch einfach Ansichtssache...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Logikproblem: Auf Mouselistener warten Java Basics - Anfänger-Themen 6
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
H MouseListener klicks begrenzen Java Basics - Anfänger-Themen 4
H MouseListener begrenzen und Speichern Java Basics - Anfänger-Themen 1
V Problem - MouseListener/2DGraphics Java Basics - Anfänger-Themen 2
R Variablen MouseListener funktioniert auf anderen Pcs nur bedingt Java Basics - Anfänger-Themen 6
G MouseListener funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
GRAZZ0R MouseListener - Rechteck Bewegen Java Basics - Anfänger-Themen 1
R Variable Klassenübegreifend MouseListener Java Basics - Anfänger-Themen 0
D MouseListener funktioniert nach Timerstart nicht mehr Java Basics - Anfänger-Themen 9
J MouseListener für Schleifen-Objekte Java Basics - Anfänger-Themen 13
S vom JPanel aus durch Mouselistener Internet aufrufen Java Basics - Anfänger-Themen 6
S GUI ImageIcon Mouselistener Link Java Basics - Anfänger-Themen 0
P MouseListener funktioniert nicht Java Basics - Anfänger-Themen 6
J KeyListener,MouseListener,MouseMotionListener und static Java Basics - Anfänger-Themen 7
P Problem mit MouseListener Java Basics - Anfänger-Themen 4
T MouseListener, recht Taste Java Basics - Anfänger-Themen 2
M MouseListener funktioniert nicht Java Basics - Anfänger-Themen 9
E Mouselistener auf jTable Java Basics - Anfänger-Themen 18
B Variablen an MouseListener übergeben Java Basics - Anfänger-Themen 5
H MouseListener für ein eingefügtes Bild in einem JFrame Java Basics - Anfänger-Themen 7
H Mouselistener bei JTable Java Basics - Anfänger-Themen 4
G MouseListener für mehrere Buttons Java Basics - Anfänger-Themen 11
J MouseListener fuer gezeichnete Polyline Java Basics - Anfänger-Themen 3
L Label + MouseListener Java Basics - Anfänger-Themen 12
M MouseListener funkioniert auf JPanel nicht Java Basics - Anfänger-Themen 8
P Jtree MouseListener und NoCollapse Java Basics - Anfänger-Themen 2
M Schiebepuzzle: MouseListener und Graphics? Java Basics - Anfänger-Themen 6
M MouseListener Java Basics - Anfänger-Themen 2
kitz MouseListener Java Basics - Anfänger-Themen 8
B MouseListener & Graphics Java Basics - Anfänger-Themen 10
D Problem mit Mouselistener und jtable Java Basics - Anfänger-Themen 7
C fragen zu MouseListener Java Basics - Anfänger-Themen 3
M MouseListener funktioniert in jar-file nicht mehr Java Basics - Anfänger-Themen 13
S Probleme mit 2 mouselistener Java Basics - Anfänger-Themen 6
A Frage zu MouseListener Java Basics - Anfänger-Themen 2
D Mouselistener Java Basics - Anfänger-Themen 2
A jPanel an MouseListener übergeben? Java Basics - Anfänger-Themen 2
S Swing JEditoPane MouseListener Java Basics - Anfänger-Themen 5
M Mouselistener Java Basics - Anfänger-Themen 4
S MouseListener funzt net. Java Basics - Anfänger-Themen 5
G MouseListener double click? Java Basics - Anfänger-Themen 1
V MouseListener Java Basics - Anfänger-Themen 5
M MouseListener Java Basics - Anfänger-Themen 3
N Mouselistener? Java Basics - Anfänger-Themen 5
T ein MouseListener pro Objekt sinnvoll? Java Basics - Anfänger-Themen 4
F MouseListener - Unhandled IOException Java Basics - Anfänger-Themen 2
U MouseListener Java Basics - Anfänger-Themen 2
L Array von Buttons, jeder soll MouseListener haben Java Basics - Anfänger-Themen 5
S MouseListener - Events auf Mouseklick Java Basics - Anfänger-Themen 14
L MouseListener Problem. Java Basics - Anfänger-Themen 2
S mouselistener Java Basics - Anfänger-Themen 3
N MouseListener Java Basics - Anfänger-Themen 2
J MouseListener implementieren Java Basics - Anfänger-Themen 12
P MouseListener wird anscheinend nicht benutzt Java Basics - Anfänger-Themen 12
N MouseListener - reagiert zu spät Java Basics - Anfänger-Themen 3
D JList - Textzeilen MouseListener zuweisen Java Basics - Anfänger-Themen 4
M prüfen ob mouselistener gesetzt ist. Java Basics - Anfänger-Themen 10
O image und mouseListener Java Basics - Anfänger-Themen 15
W MouseListener Probleme beim Abfangen Java Basics - Anfänger-Themen 8
P Kann keinen MouseListener hinzufügen Java Basics - Anfänger-Themen 3
G MouseListener einbauen - wie? Java Basics - Anfänger-Themen 4
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
E Richtiges Warten Java Basics - Anfänger-Themen 8
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
G Wie kann ich 1s lang warten? Java Basics - Anfänger-Themen 1
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
A Thread auf anderen warten Java Basics - Anfänger-Themen 2
C Warten auf Antwort Java Basics - Anfänger-Themen 22
S Threads Programm terminiert statt zu warten Java Basics - Anfänger-Themen 20
E ExecutorService warten bis alles fertig? Java Basics - Anfänger-Themen 5
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Input/Output Auf Tasteneingabe warten Java Basics - Anfänger-Themen 4
A Activity1 soll auf Activity2 warten (Camera-Intent) Java Basics - Anfänger-Themen 5
D Threads Kartenspiel - auf legen warten Java Basics - Anfänger-Themen 15
B Methode warten lassen bis Button gedrückt wird Java Basics - Anfänger-Themen 16
JAVAnnik auf Threadende warten Java Basics - Anfänger-Themen 6
H Auf Threads warten Java Basics - Anfänger-Themen 3
S Warten bis alle Threads fertig sind Java Basics - Anfänger-Themen 12
I Auf DB-Operation warten Java Basics - Anfänger-Themen 2
R Thread soll auf andere Threads warten Java Basics - Anfänger-Themen 3
T Warteschlange warten lassen bis Ereignis Java Basics - Anfänger-Themen 27
A Main warten lassen bis Variable durch Button übergeben wird Java Basics - Anfänger-Themen 2
V Warten bis die Länge eines Strings nicht mehr 0 ist Java Basics - Anfänger-Themen 13
M prozess starten und warten bis dieser sich beendet Java Basics - Anfänger-Themen 3
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
D Auf Event warten Java Basics - Anfänger-Themen 4
M Warten bis Thread an einem Semaphore angekommen ist Java Basics - Anfänger-Themen 4
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
S Auf andere Methode warten Java Basics - Anfänger-Themen 7
B Während Schleife nicht auf Eingabe warten Java Basics - Anfänger-Themen 2
T auf vbscript warten Java Basics - Anfänger-Themen 3
S Thread warten abbrechen? Java Basics - Anfänger-Themen 5
C auf beendigung eines threads warten Java Basics - Anfänger-Themen 6
P Warten auf KeyTyped Java Basics - Anfänger-Themen 7
M warten in einer while-schleife Java Basics - Anfänger-Themen 12
L programm zum warten zwingen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben