Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
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) {
}
});
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
Der KeyAdapter ist abstrak und wird als annonyme Innere Klasse implementiert.
ca
frame.addKeyListener ( new (MyInnerClass extends KeyAdapter { public void keyTyped(KeyEvent e) {} } ))
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?
>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]
@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
>..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)