gedrückte Tasten abfragen

Status
Nicht offen für weitere Antworten.

Bergmann

Aktives Mitglied
Hi,

ich bin grad dabei mir Tetris zu bauen, als kleines Einstiegsprojekt in Java. Und ich such ne Möglichkeit die gedrückten Tasten abzufragen. Das müsste ja mit nem KeyListener gehen, oder? Aber bis jetzt hab ich nur Tutorials gefunden, die den KeyListener in einem Edit eintragen. Ich hab aber bis auf mein JFrame nichts weiter. Muss ich das jetzt mit nem Edit machen, oder lässt sich das auch anders realisieren?

MfG Bergmann.
 
>(Edit heißt es bei Pascal)

Hab ich seit ca 10 Jahren nicht mehr geschrieben, wär mir jetzt nicht eingefallen.

Grundsätzlich addest du den KeyListener oder KeyAdapter in der Komponente (Component) in der du möchtest.
Für ein JFrame wäre das genau gleich wie für ein JPanel. Zeichnen sollte man meist in ein JPanel und
nicht direkt in ein JFrame.

Bsp Code:

Code:
JFrame frame = new JFrame();
frame.addKeyListener(new KeyListener() {
	@Override
	public void keyPressed(KeyEvent e) {
	}
	@Override
	public void keyReleased(KeyEvent e) {
	}
	@Override
	public void keyTyped(KeyEvent e) {
	}
});
// oder (bei Abstrakten klassen müssen wir nicht alles überschreiben
frame.addKeyListener(new KeyAdapter() {
	@Override
	public void keyTyped(KeyEvent e) {
	}			
});
 
Zuletzt bearbeitet:
bei Abstrakten klassen müssen wir nicht alles überschreiben
Wo ist hier eine abstrakte Klasse? new Whatever() ist nicht abtrakt. Also ich glaube nicht dass dein zweites Bsp jemals funktioniert, egal in welchem Kontext. KeyAdapter mag vllt abstrakt sein, aber du erstellst hier ja eine anonyme Klasse, die sicherlich nicht abstrakt ist (sonst würde ein new() gar nicht gehen) Oder irre ich mich ???:L Würde mich grad stark wundern?! Also nicht dass ich mich irre..^^ Aber.. wie kann man einem Objekt nen abstrakten Listener adden... Geht doch net?! Das muss doch immer eine konkrete Implementierung sein
 
Zuletzt bearbeitet:
>What? Wo ist hier eine abstrakte Klasse?

Der KeyAdapter ist abstrak und wird als annonyme Innere Klasse implementiert.
ca
frame.addKeyListener ( new (MyInnerClass extends KeyAdapter { public void keyTyped(KeyEvent e) {} } ))

wobei der Code nicht gehen wird
 
Ja also, reden wir jetzt aneinander vorbei? Kurz gesagt: Anonyme Klassen können doch niemals abstrakt sein, deshalb musst du immer alles implementieren. Oder war diese Info nur so reingeworfen, und hat mit diesem Thema nix zu tun?
wobei der Code nicht gehen wird
Eben, das wird es niemals bei so einem Konstrukt
 
>Anonyme Klassen können doch niemals abstrakt sein, deshalb musst du immer alles implementieren.

Das ist bereits die Implementierung der abstrakten Klasse als annonyme innere Klasse (welche dann nicht mehr abstact ist sondern eben die imlementierung...)

>Eben, das wird es niemals bei so einem Konstrukt

sicher doch.

nur bei:
frame.addKeyListener(new KeyListener() {
muss man alle Methode vom KeyListener implementieren (weil ein Interface)
und bei
frame.addKeyListener(new KeyAdapter() {
nur die Methoden, die man möchte (da in der Abstrakten Klasse schon alle implementiert sind)

[edit] KeyAdapter implementier die Methoden von KeyLsitener nicht als abstract)
[/edit]

>Ja also, reden wir jetzt aneinander vorbei?

ähm..kann sein?
 
@hdi: Das was der Müde Joe da vor hat wird von mir immer mal gerne verwendet (eigentlich aber mit dem WindowAdapter):[highlight=java]frame.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent evt) {
// eventhandling
}
};[/highlight]
 
Ja aber das hat doch nichts damit zu tun dass KeyAdapter abstrakt ist. Du hast einfach an dieser Stelle im Programm keine abstrakte Klasse, sondern eine Implementierung. D.h. - ich finde - man hätte nicht sagen sollen

bei Abstrakten klassen müssen wir nicht alles überschreiben

sondern:

bei Klassen die das schon implementieren müssen wir es nicht überschreiben

...ob KeyAdapter nun abstrakte Klasse oder nicht -> spielt hier doch keine Rolle?
 
>..ob KeyAdapter nun abstrakte Klasse oder nicht -> spielt hier doch keine Rolle?

nein, das spielt keine Rolle. Es könnte auch jede andere Implemtierung da stehen. Wobei
aber richtige Implemtierungen eben ein add(new KeyWhatever() ) ausreicht, die abstrakte
Klasse das aber nicht will (hier zumindest noch ein {}, da keine Mehtode abstract ist)
 
Ah ok, jetzt reden wir vom selben 😉 Ich finde deine Ausdrucksweise weiter unten war etwas irreführend, aber genauso war meine erste Aussage irreführend, vonwegen dass das nicht kompiliert (ich wusste nicht dass KeyAdapter das Interface implementiert)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben