Keylistener implementieren

  • Themenstarter Themenstarter ByeBye 249712
  • Beginndatum Beginndatum
Müsst ihr euch jetzt schon gegenseitig nerven nur weil einer das Interesse an einem Thread verliert weil der Thread-Ersteller noch *scheinbar* sehr unerfahren ist ?

Das ist irgendwie ... witzig.

Wobei ich mich auch der Meinung anschließen muss : Design und Implementierung sind ziemlich schlecht.
Vielleicht solltest du dir mal ein Blatt Papier und einen Bleistift nehmen und dir erstmal Gedanken machen wie das ganz über logisch funktionieren soll / kann. Über eine konkrete Implementierung kann man sich dann immer noch den Kopf zerbrechen *wobei mir auf anhieb so einiges einfallen würde das "Problem" in ein paar Minuten zu lösen*.

Falls es dir nicht zu viel ist kannst du dir ja mal mein Schiffe-Versenken angucken *siehe Signatur* *das sollte ich eigentlich auch langsam mal fertig machen* ... es ist zwar auch nicht das beste OOP .. aber man erkennt deutlich die Manipulationsstrukturen ...
 
Wobei ich mich auch der Meinung anschließen muss : Design und Implementierung sind ziemlich schlecht.
Vielleicht solltest du dir mal ein Blatt Papier und einen Bleistift nehmen und dir erstmal Gedanken machen wie das ganz über logisch funktionieren soll / kann. Über eine konkrete Implementierung kann man sich dann immer noch den Kopf zerbrechen

Ob das Design oder die Implementierung ziemlich schlecht ist soll mir recht sein, wenn das programm denn einfach mal nur funktionieren würde. Den Code habe ich, bis auf den Controller übernommen.

*wobei mir auf anhieb so einiges einfallen würde das "Problem" in ein paar Minuten zu lösen*.

Warum sagst du es mir dann nicht.Zu sagen ich kenn die Lösung aber sie nicht zu posten. hmm... ich weis nicht!

Ich würde dir dann doch noch mal einen Blick in die JavaInsel empfehlen ... und GooGLe mal nach "java oop" ... da dürftest du dann im Sun-Tutorial einiges lernen.

Und mich auf google und dergleichen zu verweisen ...naja...meinst du nicht dass ich das schon probiert habe....desswegen schreibe ich doch hier. Wenn ich nicht wollen würde das man mir hier hilft würde ich auch nicht hier schreiben.
 
Zuletzt bearbeitet von einem Moderator:
Ok ... ich fass es mal ganz kurz zusammen :

Du hast eine GUI und willst das sich auf Tastendruck etwas daran ändert.

Das ist doch ganz grob gesagt das was du willst , oder ?

Was du also brauchst sind folgende Dinge :

1) Die GUI selbst
2) Das , WAS sich nachher bewegen soll ...
3) Einen KeyListener der auf den Tastendruck reagiert

Ok ... geh ich das ganze mal Schritt für schritt durch.

Als GUI nehmen wir mal ein 10x10 Raster an *für Code sieh bitte in meinem Blog nach da ich nicht wirklich Lust habe bereits gepostetes noch mal zu posten obwohl ich dich bereits auf entsprechende Stelle verwiesen habe*. Das macht 100 Felder. Jedes dieser Felder müssen wir einzeln DIREKT ansprechen können. Das machen wir entweder mit einem 2D-Array oder einer 1D-Liste und geben jedem Feld bei erzeugung einen Identifier mit *ich persönlich würde hier das 2D-Array nehmen*.

Als nächstes erzeugen wir unsere Felder. Diese brauchen *im groben ohne zu sehr ins Detail zu gehen* nur ein Flag ob sich das zu bewegende Objekt gerade auf ihnen befindet oder nicht. Demzufolge ist die Klasse für die Felder sehr einfach aufgebaut.
Da man Variablen möglichst verborgen halten soll nennen wir dieses Flag also
Java:
private boolean flag=false;
Dann noch eine Setter- und eine Getter-Methode ... hierbei ist auf Grund des Datentyps boolean auf den Namen der Getter-Methode zu achten : laut Konventionen werden Getter welche bool-Flags returnen nicht "getXXX" genannt sondern "isXXX" :
Java:
public void setFlag(boolean flag) { this.flag=flag; }
public boolean isFlag() { return flag; }
Um jetzt HIER gleich das re-Rendern zu verlassen erweitern wir die Setter Methode noch wie folgt
Java:
public void setFlag()
{
	this.flag=flag;
	update(getGraphics());
}
Wobei darauf zu achten ist das die Feld-Klasse von z.B. JPanel oder vergleichbarem erbt.

Nun fügen wir dem Container *also in deinem Fall einem JFrame* noch einen KeyListener hinzu.
Auch ich würde hier das Design mit 2 Klassen bevorzugen. Es hält den ganzen Code deutlich übersichtlicher.
Im KeyListener implementieren wird jetzt die Tasten auf die wir reagieren wollen , also z.B. WASD und lassen dann über einen Thread die entsprechenden Methoden up() left() down() righ() aufrufen.

Jedoch verwende ich KEINEN Counter wie du ... sondern arbeite direkt mit dem Array.
Jeder dieser Methoden ruft eine Setter-Methode im JFrame *dort wo auch das Array liegt* auf dem wir einen Steuerparameter *bei 4 Möglichkeiten reicht Byte als Bit-Maske aus* mitgeben.
Diese Setter-Methode geht jetzt durch das Array und sucht erstmal mit Feld.isFlag() nach der aktuellen Position des zu bewegenden Objektes , wertet die Schleifen-Counter aus und entscheidet ob die gewünschte Bewegung gültig ist. Wenn FALSE , dann wird einfach returned und es passiert nichts. Wenn TRUE wird im alten Feld mit setFlag(false) die Auswahl aufgehoben und *in Abhängigkeit zur Steuer-Bit-Maske* X oder Y um eins erhöt oder verringert und schlussendlich im "neuen" Feld mit setFlag(true) das Flag gesetzt.

Das wäre eine halbwegs vernünftige OOP-Struktur nach der du dich versuchen kannst zu richten.
Auch hier poste ich dir wieder bewusst keinen Code da ich dich ja erstmal selbst denken lassen und auf KONKRETE FRAGEN warten will.
Wenn du z.B. bei den Referenzierungen der Felder Probleme hast ... dann kann man da speziell helfen ... aber deine Aufgabe wird dir hier so einfach keiner abnehmen.
 
Zurück