Keylistener verstehen

J-Gallus

Mitglied
Moin moin, Ich muss für einen kleinen Sidescroller die Keylistener endlich mal richtig verstehen.
Aber eigentlich brauche ich auch nur die Funktion der space-Taste um mein kleines viereck springen zu lassen.
Als Test habe ich eine eigene Klasse zum ausprobieren geschrieben. Allerdings tut sich auch hier genau gar nichts, wenn ich space oder irgend eine andere Taste betätige. Ich bitte also um eure Hilfe
Hier mein Code:
Java:
package keylistener;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import acm.*;
import acm.graphics.GRect;
import acm.program.GraphicsProgram;
public class main extends GraphicsProgram {

private GRect viereck;
private KeyListener space;
private int keycode;

    public void init(){
        setSize(1000, 1000);
        viereck= new GRect(200, 200);
        viereck.setFilled(true);
        viereck.setColor(Color.BLACK);
        viereck.setLocation(200, 200);
        add(viereck);
        addKeyListeners();
    }

               
   
    @Override
        public void keyPressed(KeyEvent e) {
        keycode=e.getKeyCode();
       
        switch (keycode) {
        case KeyEvent.VK_SPACE:
            viereck.setLocation(200,100);
            remove(viereck);
            add(viereck);
            break;

        case KeyEvent.VK_ENTER:
            viereck.setLocation(200,200);
            remove(viereck);
            add(viereck);
            break;

    }
   
    }
}

Schon mal danke für eure Zeit
 

krgewb

Top Contributor
Schreibst du das mit einer Entwicklungsumgebung (z.B. Eclipse, NetBeans)? Werden da irgendwelche Syntax-Fehler angezeigt?
 

simon.java

Neues Mitglied
Also soweit ich deinen Code richtig verstanden habe, ist dein Problem, dass du weder einen KeyListener implementierst noch eine Instanz deiner Klasse, in der du KeyListener implementierst, bei der addKeyListener() Methode übergibst.

Ich zeig dir mal meinen PseudoCode, wie ich das lösen würde.

Java:
public class Main {
   
    private class MeinListener implements KeyListener {
        public  void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_SPACE) jump = true;
        }
       
        public void keyReleased(KeyEvent e) {
            if(e.getkeyCode() == KeyEvent.VK_SPACE) jump = false;
        }
    }
   
    public static void main(String [] args) {
       
        init();
       
        while (true) {
           
            update(jump);
           
            draw();
        }
    }
}

In der init() Methode muss dann auf einem JFrame (oder wenn du kein Swing benutzt ein anderes Fenster) die addKeyListener Methode aufrufen:

Java:
addKeyListener(new MeinListener);
oder
this.addKeyListener(new MeinListener);

Bei update wird getestet ob die variable jump true ist und dann wird die Position des Rechtecks verändert.

Bei draw wird der Bildschrim neu gezeichnet.

Falls du nicht weißt was PseudoCode ist: Bei Pseudocode wird einfach code geschrieben, der noch nichts macht aber dein Programm strukturiert und der Name schon sagt was gemeint ist. Die Implementierung der Methoden und Klassen wird erst danach vorgenommen.

Mfg Simon
Wenn du noch Fragen hast, kannst du sie mir gerne stellen.
 

krgewb

Top Contributor
Bei mir funktioniert das Programm von J-Gallus.
Es muss folgendermaßen gestartet werden:
Rechtsklick auf das Projekt -> Run As -> Java Applet
Danach muss einmal in das Fenster reingeklickt werden. Erst dann registriert es es, wenn die Leerstaste oder die Enter-Taste gedrückt wird.

Es muss aber zuerst acm.jar von http://cs.stanford.edu/people/eroberts/jtf/ heruntergeladen und eingebunden werden.
 
Zuletzt bearbeitet:

J-Gallus

Mitglied
Danke schon mal für eure Antworten, gerade Simons Beschreibung war gut. Ich habe mitlerweile alleine etwas weitergearbeitet und meine Listener funktionieren eigentlich so wie ich es möchte. Allerdings habe ich nun ein anderes Problem. Meine Pfeiltasten links und rechts dürfen gerne einfach bei Betätigung die Positions des Vierecks verändern, wie sie es auch wunderbar tun. Allerdings mein "sprung" also nach oben, soll ein mal betätigt werden und dann als "animation" bis zum ziel die position verändern und dann stoppen. Erst habe ich es mit einer pause und setlocation direkt im kistener versucht, dieser hat aber einfach alle pausen abgewartet und alle anweisungen erst danach direkt ausgeführt. Also keine animation. als ich die while schleife nach aussen gelegt habe, passierte bei pfeil oben, einfach gar nichts mehr.. hoffe ihr könnt mir bei dieser Stelle noch mal weiter helfen.

Java:
package keylistener;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import acm.*;
import acm.graphics.GRect;
import acm.program.GraphicsProgram;
public class main extends GraphicsProgram {

private GRect viereck;
private int keycode;
private int vary;
private boolean jump=false;
    public void init(){
        setSize(1000, 1000);
        addKeyListeners();
        paint();
    }
   
    public void run(){
        while(true){
        while(jump){
            viereck.move(0, -25); 
            pause(20);}
        if (viereck.getY()==50) {
            jump=false;
        }
       
        }
        }

    public void paint(){
        viereck= new GRect(50, 50);
        viereck.setFilled(true);
        viereck.setColor(Color.BLACK);
        viereck.setLocation(500, 800);
        add(viereck);
       
    }
   
        public void keyPressed(KeyEvent e){
        switch (e.getKeyCode()) {
        case KeyEvent.VK_UP: 
            jump=true;
            break;
            case KeyEvent.VK_DOWN: viereck.move(0, +10);break;
        case KeyEvent.VK_LEFT: viereck.move(-10, 0); break;
        case KeyEvent.VK_RIGHT: viereck.move(+10, 0);; break;
        }
           
        }
}
   

[code]

danke noch mal
 

mrBrown

Super-Moderator
Mitarbeiter
Also soweit ich deinen Code richtig verstanden habe, ist dein Problem, dass du weder einen KeyListener implementierst noch eine Instanz deiner Klasse, in der du KeyListener implementierst, bei der addKeyListener() Methode übergibst.
Naja, beides ist kein Problem^^
Das wäre sonst schon beim kompilieren aufgefallen, und da ne Fremd-Lib benutzt wird, get der Hinweis mit Swing etc etwas ins Leer ;)
 

krgewb

Top Contributor
Wenn man es so macht springt das Viereck nach oben und bleibt tatsächlich irgendwann stehen:
Java:
package keylistener;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import acm.*;
import acm.graphics.GRect;
import acm.program.GraphicsProgram;

public class main extends GraphicsProgram {

   private GRect viereck;
   private int keycode;
   private int vary;
   private boolean jump = false;

   public void init() {
       setSize(1000, 1000);
       addKeyListeners();
       paint();
   }

   public void run() {

       while (jump == true) {
           viereck.move(0, -25);
           pause(20);

           if (viereck.getY() <= 100) {
               jump = false;
           }

       }

   }

   public void paint() {
       viereck = new GRect(50, 50);
       viereck.setFilled(true);
       viereck.setColor(Color.BLACK);
       viereck.setLocation(500, 400);
       add(viereck);

   }

   public void keyPressed(KeyEvent e) {
       switch (e.getKeyCode()) {
       case KeyEvent.VK_UP:
           jump = true;
           break;
       case KeyEvent.VK_DOWN:
           viereck.move(0, +10);
           break;
       case KeyEvent.VK_LEFT:
           viereck.move(-10, 0);
           break;
       case KeyEvent.VK_RIGHT:
           viereck.move(+10, 0);
           break;
       }

   }
}
Ich habe ein paar Zahlen geändert. Dein Monitor ist deutlich größer als der Bildschirm von meinem Laptop.
 

J-Gallus

Mitglied
Echt? eigentlich habe ich die paar Veränderungen ebenfalls übernommen und bei mir tut sich weithin nichts wenn ich pfeil oben drücke
alle anderen funktionieren weiterhin..
 

krgewb

Top Contributor
Komisch. Bei mir funktioniert es nicht bei jedem Start des Programmes.
PS: Sobald man einmal nach unten gedrückt hat kann man nicht mehr springen.
 

J-Gallus

Mitglied
stimmt die while-Schleife vom logischen ablauf her? schon oder? Hast du einen anderen vorschlag? Was ich möchte, habe ich oben ja etwas beschrieben. bin also für andere Lösungen offen. Hauptsache es funktioniert.
 
X

Xyz1

Gast
Wie bereits geschrieben, grundsätzlich geht das so:
1. KeyListener initialisieren,
2. KeyListener registrieren auf eine(r) Komponente,
wenn du es anders machst, würds mich wundern, wenn es dennoch läuft.
Bin nur im Moment zu faul, ein eigenes Example zu schreiben und/oder die externe Lib zu laden.
 

J-Gallus

Mitglied
Ich soll die externe Bib laden? wie und wohin?
Für die, die bisher geholfen haben, bitte noch ein mal in das folgende Problem im Code schauen.
Die Animation nach oben, habe ich in dem Teil über den Kommentaren schon hinbekommen.
Java:
package keylistener;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import acm.*;
import acm.graphics.GRect;
import acm.program.GraphicsProgram;

public class main extends GraphicsProgram {

    private GRect viereck;
    private int keycode;
    private int vary;
    private boolean jump = false;
    private boolean getdown = false;

    public void init() {
        setSize(1000, 1000);
        addKeyListeners();
        paint();
    }

    public void run() {
        while (true) {
            while (jump == true) {
                viereck.move(0, -10);
                pause(20);
                if (viereck.getY() <= 300) {
                    getdown = true;
                    jump = false;
                }

            }
            pause(20);
       // in dem auskommentierten Bereich versuche ich gerade mein viereck auch wieder als animation 
// von der sprunghöhe wieder zurück zum boden zubekommen. Das ganze soll natürlich direkt als ablauf //hinter dem sprung ohne zusätzlich nötige interaktion. Leider macht das ganze wieder nichts, wenn ich //den Teil hinzufüge und ich habe noch nicht verstanden warum. Die Lösung für den ersten Teil
//            while (getdown == true) {
//                pause(20);
//                while (viereck.getY() >= 800) {
//                    viereck.move(0, +10);
//                    pause(20);
//                    if (viereck.getY() >= 700) {
//                        getdown = false;
//                    }
//                }
//            }
        }
    }

    public void paint() {
        viereck = new GRect(50, 50);
        viereck.setFilled(true);
        viereck.setColor(Color.BLACK);
        viereck.setLocation(500, 800);
        add(viereck);

    }

    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
        case KeyEvent.VK_UP:
            if (viereck.getY() == 800) {
                jump = true;
            }
            break;
        case KeyEvent.VK_LEFT:
            viereck.move(-10, 0);
            break;
        case KeyEvent.VK_RIGHT:
            viereck.move(+10, 0);
            ;
            break;
        }

    }
}

[code]
 

J-Gallus

Mitglied
Ich soll die externe Bib laden? wie und wohin?
Für die, die bisher geholfen haben, bitte noch ein mal in das folgende Problem im Code schauen.
Die Animation nach oben, habe ich in dem Teil über den Kommentaren schon hinbekommen.
Java:
package keylistener;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import acm.*;
import acm.graphics.GRect;
import acm.program.GraphicsProgram;

public class main extends GraphicsProgram {

    private GRect viereck;
    private int keycode;
    private int vary;
    private boolean jump = false;
    private boolean getdown = false;

    public void init() {
        setSize(1000, 1000);
        addKeyListeners();
        paint();
    }

    public void run() {
        while (true) {
            while (jump == true) {
                viereck.move(0, -10);
                pause(20);
                if (viereck.getY() <= 300) {
                    getdown = true;
                    jump = false;
                }

            }
            pause(20);
       // in dem auskommentierten Bereich versuche ich gerade mein viereck auch wieder als animation 
// von der sprunghöhe wieder zurück zum boden zubekommen. Das ganze soll natürlich direkt als ablauf //hinter dem sprung ohne zusätzlich nötige interaktion. Leider macht das ganze wieder nichts, wenn ich //den Teil hinzufüge und ich habe noch nicht verstanden warum. Die Lösung für den ersten Teil
//            while (getdown == true) {
//                pause(20);
//                while (viereck.getY() >= 800) {
//                    viereck.move(0, +10);
//                    pause(20);
//                    if (viereck.getY() >= 700) {
//                        getdown = false;
//                    }
//                }
//            }
        }
    }

    public void paint() {
        viereck = new GRect(50, 50);
        viereck.setFilled(true);
        viereck.setColor(Color.BLACK);
        viereck.setLocation(500, 800);
        add(viereck);

    }

    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
        case KeyEvent.VK_UP:
            if (viereck.getY() == 800) {
                jump = true;
            }
            break;
        case KeyEvent.VK_LEFT:
            viereck.move(-10, 0);
            break;
        case KeyEvent.VK_RIGHT:
            viereck.move(+10, 0);
            ;
            break;
        }

    }
}

[code]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
javalux123 Keylistener auf andere Fenster Java Basics - Anfänger-Themen 3
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
M KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
M Mit KeyListener Farbe von Label ändern Java Basics - Anfänger-Themen 13
N Java Keylistener Java Basics - Anfänger-Themen 2
B KeyListener funkioniert nicht Java Basics - Anfänger-Themen 2
F KeyListener Java Basics - Anfänger-Themen 3
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
S Keylistener Java Basics - Anfänger-Themen 16
S Keylistener im Grafikfenster Java Basics - Anfänger-Themen 3
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
N KeyListener in Thread Java Basics - Anfänger-Themen 0
LexeB4F for schliefe in KeyListener Java Basics - Anfänger-Themen 3
R KeyListener auslagern Java Basics - Anfänger-Themen 3
J KeyListener aus anderer Klasse bereitet Probleme Java Basics - Anfänger-Themen 1
Z KeyListener funktioniert nicht? Weshalb? Java Basics - Anfänger-Themen 8
T KeyListener Java Basics - Anfänger-Themen 2
Gfreak23 Input/Output KeyListener funktioniert auf Laptop nicht allerdings auf Tower-PC Java Basics - Anfänger-Themen 8
J KeyListener - mal wieder... Java Basics - Anfänger-Themen 2
TheSorm KeyListener Problem Java Basics - Anfänger-Themen 4
M KeyListener Java Basics - Anfänger-Themen 3
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
D KeyListener nicht mehr aktiv nach ActionPerformed Java Basics - Anfänger-Themen 2
C Mehrere Tasten beim KeyListener gleichzeitig lesen Java Basics - Anfänger-Themen 2
L Input/Output Java 3D mit KeyListener Java Basics - Anfänger-Themen 1
S KeyListener reagiert nicht. Java Basics - Anfänger-Themen 4
L KeyListener ohne textfeld Java Basics - Anfänger-Themen 4
J KeyListener,MouseListener,MouseMotionListener und static Java Basics - Anfänger-Themen 7
P Klassen Bei KeyEvent in KeyListener den Tastendruck abbrechen Java Basics - Anfänger-Themen 5
B KeyListener als allgemeine Methode Java Basics - Anfänger-Themen 5
H KeyListener auf ganzes Fenster setzen Java Basics - Anfänger-Themen 14
0 KeyListener ausserhalb der Applikation Java Basics - Anfänger-Themen 5
G KeyListener Java Basics - Anfänger-Themen 4
D KeyListener und ActionListener Problem Java Basics - Anfänger-Themen 6
J KeyListener funtioniert nicht! Java Basics - Anfänger-Themen 3
J KeyListener Java Basics - Anfänger-Themen 11
P Input/Output KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
G KeyListener, Fokus Java Basics - Anfänger-Themen 8
K Input/Output KeyListener funktioniert nicht Java Basics - Anfänger-Themen 3
A Input/Output Keylistener Aktiv schalten Java Basics - Anfänger-Themen 8
J keyListener - Genau 1 Aktion soll bei 1 Tastenausdruck ausgeführt werden Java Basics - Anfänger-Themen 11
S KeyListener Java Basics - Anfänger-Themen 2
A Erste Schritte Problem mit KeyListener Java Basics - Anfänger-Themen 6
Maxim6394 KeyListener geht nicht Java Basics - Anfänger-Themen 15
A Wie KeyListener adden? Java Basics - Anfänger-Themen 15
Maxim6394 KeyListener funktioniert nicht Java Basics - Anfänger-Themen 20
U KeyListener StackOverflowError Java Basics - Anfänger-Themen 2
W KeyListener auf Applet mit Runnable Java Basics - Anfänger-Themen 4
M Apfel-Spiel KeyListener Java Basics - Anfänger-Themen 33
J KeyListener (keyTyped) funktioniert nicht Java Basics - Anfänger-Themen 9
Luk10 KeyListener Java Basics - Anfänger-Themen 13
S KeyListener aus anderer Klasse hinzufügen Java Basics - Anfänger-Themen 19
P KeyListener im Applet Java Basics - Anfänger-Themen 2
S KeyListener-Anwendung Java Basics - Anfänger-Themen 7
O KeyListener funktioniert nur wenn er will Java Basics - Anfänger-Themen 2
A KeyListener funzt ned Java Basics - Anfänger-Themen 6
D KeyListener, Unterscheidung Groß/Kleinbuchstaben Java Basics - Anfänger-Themen 3
S KeyListener als class? Java Basics - Anfänger-Themen 4
F Applet mit KeyListener, "Alt"-Taste und Konflikt mit Browser Java Basics - Anfänger-Themen 2
P KeyListener Java Basics - Anfänger-Themen 2
S KeyListener für einfaches Programm Java Basics - Anfänger-Themen 3
S KeyListener aktiv auch wenn minimiert? Java Basics - Anfänger-Themen 4
Z Globaler Keylistener Java Basics - Anfänger-Themen 2
V KeyListener Beispiel Java Basics - Anfänger-Themen 13
T canvas killt KeyListener Java Basics - Anfänger-Themen 2
Das Brot Nach .add(JRadioButton) funktioniert der KeyListener nicht mehr Java Basics - Anfänger-Themen 2
J Keylistener aber wie jTextField auswahl? Java Basics - Anfänger-Themen 3
D KeyListener, nichts passiert Java Basics - Anfänger-Themen 6
U ActionListener und KeyListener - KeyListener funktioniert nicht Java Basics - Anfänger-Themen 2
D Keylistener zu langsam Java Basics - Anfänger-Themen 7
C Problem mit JPopupMenu, JTextField und Keylistener Java Basics - Anfänger-Themen 2
G Keylistener in einer Schleife Java Basics - Anfänger-Themen 9
M problem mit keylistener Java Basics - Anfänger-Themen 2
M TabbedPane: KeyListener funktioniert nicht mehr Java Basics - Anfänger-Themen 8
N KeyListener ohne GUI? Java Basics - Anfänger-Themen 5
M KeyListener Java Basics - Anfänger-Themen 3
T KeyListener wird nicht ausgelöst Java Basics - Anfänger-Themen 6
O KeyListener Java Basics - Anfänger-Themen 8
Developer_X KeyListener ohne JFrame Java Basics - Anfänger-Themen 13
H KeyListener Java Basics - Anfänger-Themen 4
Developer_X KeyListener Actions (hat mit Java3D zu tun) Java Basics - Anfänger-Themen 20
H KeyListener funktioniert nicht Java Basics - Anfänger-Themen 8
Developer_X JFrame soll KeyListener adden Java Basics - Anfänger-Themen 32
F Keylistener Java Basics - Anfänger-Themen 12
hdi KeyListener : keyTyped() nicht nutzbar? Java Basics - Anfänger-Themen 1
StickToFreak Runnable + KeyListener? Java Basics - Anfänger-Themen 32
dl85hej Keylistener Java Basics - Anfänger-Themen 16
H KeyListener will nicht reagieren Java Basics - Anfänger-Themen 5
R Fehlersuche - KeyListener, KeyAdaper - Nichts Klappt! Java Basics - Anfänger-Themen 2
G Prob. mit KeyListener und Unterklasse Java Basics - Anfänger-Themen 5
G Keylistener nur besimmte Zeichen zulassen Java Basics - Anfänger-Themen 8
hdi keylistener hat keinen fokus oder: listener ohne frame? Java Basics - Anfänger-Themen 10
A KeyListener funktioniert nicht Java Basics - Anfänger-Themen 7
D KeyListener Java Basics - Anfänger-Themen 7
B Keylistener auf JSpinner reagiert nicht? Java Basics - Anfänger-Themen 3
G KeyListener für die Taste "/" Java Basics - Anfänger-Themen 5
E brauche hilfe beim KeyListener Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben