KeyListener

julian.veh

Bekanntes Mitglied
Bin gerade an einem Tutorial für Spiele und habe das Problem, dass der KeyListener nicht funktioniert. Ich habe natürlich nicht alles 1:1 kopiert, aber ich bin mir sicher den Schritten gefolgt zu sein und so wie ich das bis jetzt verstanden habe, müsste es eigentlich gehen. Ich habe zum Test erstmal den Key der eingegeben wird probiert ausgeben zu lassen, aber selbst hier passiert nichts. Vielleicht habe ich ja einen Fehler gemacht und jemand kann mir helfen? Gruß

Java:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class BallApplet extends Applet implements Runnable, KeyListener {

    int x_pos = 10;
    int y_pos = 10;
    int radius = 20;
    boolean richtungx;
    boolean richtungy;
    private Thread thread;

    public void init() {
        setBackground(Color.black);
        addKeyListener(this);
    }

    public void start() {
        this.thread = new Thread(this);
        thread.start();
        init();
    }

    public void stop() {
    }

    public void destroy() {
    }

    public void run() {

        while (true) {
            if (x_pos == 780) {
                richtungx = false;
            }
            if (x_pos == 20 | x_pos == 0) {
                richtungx = true;
            }
            if (y_pos == 20) {
                richtungy = false;
            }
            if (y_pos == 580) {
                richtungy = true;
            }
            
            if (richtungx) {
                x_pos = x_pos + 10;
            }
            if (richtungx == false) {
                x_pos = x_pos - 10;
            }
            if (richtungy) {
                y_pos = y_pos - 10;
            }
            if (richtungy == false) {
                y_pos = y_pos + 10;
            }
            repaint();
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
            }
        }
    }

    public void paint(Graphics g) {
        g.setColor(Color.red);
        g.fillOval(x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
    }

    public boolean mouseDown(Event e, int x, int y) {
        if (richtungx) {
            richtungx = false;
        } else {
            richtungx = true;
        }
        return true;
    }

    public void keyPressed(KeyEvent e) {
        System.out.println("" + e.getKeyChar());
    }

    public void keyReleased(KeyEvent e) {
        System.out.println("" + e.getKeyChar());

    }

    public void keyTyped(KeyEvent e) {
        System.out.println("" + e.getKeyChar());
    }
}

Java:
import javax.swing.JFrame;


public class JavaApplication24 {
    
    public static void main(String[] args) {
        BallApplet ba = new BallApplet();
        JFrame frame1 = new JFrame("Ball");
        frame1.setSize(800,600);
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.add(ba);
        frame1.setVisible(true);
        ba.run();
        
    }
}

||edit: Also egal welche Taste ich betätige, wird sie vom Programm ignoriert.
 
Zuletzt bearbeitet:

jgh

Top Contributor
dein "Fehler" ist, dass du dem Applet noch einen Frame verpasst. Für ein (J)Applet brauchst du keine main-Methode, ein Applet wird normalerweise im Browser ausgeführt, bzw. bei einer IDE im Applet-Viewer.
Dann ist die Startpunkt deines Applets, die init-Methode.

Lass deine main-Methode weg, dann klappt das auch wunderbar mit dem Key-Listener...oder du packst dein Applet in einen Frame, dann musst du dem Frame auch den Key-Listener adden.

[edit]ohne Main-Methode wird mir bei deinem Code jeder Tastendruck ausgegeben[/edit]
 

julian.veh

Bekanntes Mitglied
dein "Fehler" ist, dass du dem Applet noch einen Frame verpasst. Für ein (J)Applet brauchst du keine main-Methode, ein Applet wird normalerweise im Browser ausgeführt, bzw. bei einer IDE im Applet-Viewer.
Dann ist die Startpunkt deines Applets, die init-Methode.

Lass deine main-Methode weg, dann klappt das auch wunderbar mit dem Key-Listener...oder du packst dein Applet in einen Frame, dann musst du dem Frame auch den Key-Listener adden.



Achso, deswegen packt der seine Spiele immer in Browser.
Das habe ich dann wohl überlesen, danke :).

Wäre es den Quatsch ein Applet in einen Frame zu packen?
Hatte eigentlich schon vor ein Spiel in einem Frame zu machen, könnte mir jemand ein anderes Tutorial empfehlen, wenn das dann Quatsch ist?

||Achso Applet Viewer, habe ich auch überlesen. Danke ;)
 

Kevin94

Top Contributor
Sieht das Tutorial auch vor, dass du das Applet in einem Frame startest?

Das ist nämlich das Problem: Zum einen wird die init-Methode nie aufgerufen und zum Anderen bekommt nur die Componente KeyEvents, die auch den Fokus hat. Wenn du dein Applet direkt startest oder im Appletviewer müsste es funktionieren, weil das Applet die "Oberste" Componente ist und somit immer den Fokus hat. Du müsstest, wenn du einen sauberen Wrapper für das Applet schreiben willst am Ende der main-Methode noch init,start und ba.requestFocus aufrufen.
 

jgh

Top Contributor
um dein Code zum Laufen zu bringen, brauchst du -wie gesagt- nur dem Frame dem KeyListener zu adden...

Java:
class JavaApplication24 {
	public JavaApplication24() {
		BallApplet ba = new BallApplet();
		JFrame frame1 = new JFrame("Ball");
		frame1.setSize(800, 600);
		frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame1.add(ba);
		frame1.addKeyListener(ba);
		frame1.setVisible(true);
		ba.run();

	}

	public static void main(String[] args) {
		new JavaApplication24();
	}
}

es ist imho "Quatsch" einem Frame ein Applet zu adden...andersrum wird ein Schuh daraus. Wenn du eine Desktopapplication mit "MenüBar" und sonstigem Krimskrams hast und sie im Web zugänglich machen willst, kannst du einem (J)Applet dem (J)Frame adden....andersrum macht es wenig Sinn.
Wobei Webstart per jnlp-Datei sicherlich die bessere Lösung wäre.

Außerdem solltest du dich entscheiden, welches Paket du benutzen willst. JApplet und JFrame aus dem swing-Packet, oder Applet und Frame aus dem awt-Package. Nicht unbedingt mischen...das kann zu Fehlern führen.
 

julian.veh

Bekanntes Mitglied
um dein Code zum Laufen zu bringen, brauchst du -wie gesagt- nur dem Frame dem KeyListener zu adden...

Java:
class JavaApplication24 {
	public JavaApplication24() {
		BallApplet ba = new BallApplet();
		JFrame frame1 = new JFrame("Ball");
		frame1.setSize(800, 600);
		frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame1.add(ba);
		frame1.addKeyListener(ba);
		frame1.setVisible(true);
		ba.run();

	}

	public static void main(String[] args) {
		new JavaApplication24();
	}
}

es ist imho "Quatsch" einem Frame ein Applet zu adden...andersrum wird ein Schuh daraus. Wenn du eine Desktopapplication mit "MenüBar" und sonstigem Krimskrams hast und sie im Web zugänglich machen willst, kannst du einem (J)Applet dem (J)Frame adden....andersrum macht es wenig Sinn.
Wobei Webstart per jnlp-Datei sicherlich die bessere Lösung wäre.

Außerdem solltest du dich entscheiden, welches Paket du benutzen willst. JApplet und JFrame aus dem swing-Packet, oder Applet und Frame aus dem awt-Package. Nicht unbedingt mischen...das kann zu Fehlern führen.

ja ich gehe immer auf fix imports, aber werde ich beachten danke :).
 

julian.veh

Bekanntes Mitglied
Jetzt funktioniert es wenigstens, allerdings habe ich das nur gemacht um zu wissen mit was ich die gedrückte Taste vergleichen muss um zu wissen ob die links taste gedrückt wurde ^^. Jetzt kommt da immer so ein Kasten. Ich probier das erstmal mit w a s d glaube ich ^^. Aber vllt kann mir das ja auch jemand sagen :)

Danke jedenfalls ;) und Grüße
 

julian.veh

Bekanntes Mitglied
Habs noch nicht so ganz raus. Habe jetzt mal für den Ball eine weitere Klasse definiert und es wird gar nichts mehr angezeigt.

Java:
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Main extends Applet implements Runnable, KeyListener {

    private Thread thread;
    public Image backimage;
    
    private Image dbImage;
    private Graphics dbg;
    private String richtungx = "steh";
    private String richtungy = "steh";
    
    public Ball ball;

    public void start() {
        this.thread = new Thread(this);
        thread.start();
    }
    
    public void stop() {
    }
    
    public void run() {
        while(true) {
            ball.move(richtungx, richtungy);
            repaint();
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                
            }
        }
    }
    
    public void paint(Graphics g) {
        
        g.drawImage(backimage, 0, 0, this);
        ball.drawBall(g);
    }
    
    public void keyPressed(KeyEvent e) {
        if (e.getKeyChar() == 'w') {
            richtungy = "vor";
            richtungx = "steh";
            
        }
        if (e.getKeyChar() == 's') {
            richtungy = "zurueck";
            richtungx = "steh";
            
        }
        if (e.getKeyChar() == 'a') {
            richtungx = "zurueck";
            richtungy = "steh";
            
        }
        if (e.getKeyChar() == 'd') {
            richtungx = "vor";
            richtungy = "steh";
            
        }
    }

    public void keyReleased(KeyEvent e) {
        if (e.getKeyChar() == 'w') {
            richtungy = "vor";
            richtungx = "steh";
            
        }
        if (e.getKeyChar() == 's') {
            richtungy = "zurueck";
            richtungx = "steh";
            
        }
        if (e.getKeyChar() == 'a') {
            richtungx = "zurueck";
            richtungy = "steh";
            
        }
        if (e.getKeyChar() == 'd') {
            richtungx = "vor";
            richtungy = "steh";
            
        }
    }
    public void keyTyped(KeyEvent e) {
        if (e.getKeyChar() == 'w') {
            richtungy = "vor";
            richtungx = "steh";
            
        }
        if (e.getKeyChar() == 's') {
            richtungy = "zurueck";
            richtungx = "steh";
            
        }
        if (e.getKeyChar() == 'a') {
            richtungx = "zurueck";
            richtungy = "steh";
            
        }
        if (e.getKeyChar() == 'd') {
            richtungx = "vor";
            richtungy = "steh";
            
        }
    }
    
    public void update(Graphics g) {
        if (dbImage == null) {
            dbImage = createImage(this.getSize().width, this.getSize().height);
            dbg = dbImage.getGraphics();
        }
        dbg.setColor(getBackground());
        dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
        dbg.setColor(getForeground());
        paint(dbg);
        g.drawImage(dbImage, 0, 0, this);
    }
}

Java:
import java.awt.Color;
import java.awt.Graphics;


public class Ball {

    private Color farbe;
    private int geschwindigkeit;
    private int richtungx = 0;
    private int richtungy = 0;
    private int xPos = 50;
    private int yPos = 50;
    private int speed = 3;
    private int  radius = 20;

    public Ball(int geschwindigkeit, String richtungx, String richtungy, Color c) {
        this.farbe = c;
        this.geschwindigkeit = geschwindigkeit;

        if (richtungx.equals("vor")) {
            this.richtungx = 1;
        } else if (richtungx.equals("zurueck")) {
            this.richtungx = -1;
        } else if (richtungx.equals("steh")) {
            this.richtungx = 0;
        }
        if (richtungy.equals("vor")) {
            this.richtungy = 1;
        } else if (richtungy.equals("zurueck")) {
            this.richtungy = -1;
        } else if (richtungy.equals("steh")) {
            this.richtungy = 0;
        }
    }

    public void move(String trichtungx, String trichtungy) {
        if (trichtungx.equals("vor")) {
            this.richtungx = 1;
        } else if (trichtungx.equals("zurueck")) {
            this.richtungx = -1;
        } else if (trichtungx.equals("steh")) {
            this.richtungx = 0;
        }
        if (trichtungy.equals("vor")) {
            this.richtungy = 1;
        } else if (trichtungy.equals("zurueck")) {
            this.richtungy = -1;
        } else if (trichtungy.equals("steh")) {
            this.richtungy = 0;
        }
        
        while (true) {
            if (richtungx == -1) {
                xPos = xPos - speed;
            } else if (richtungx == 0) {
                xPos = xPos;
            } else if (richtungx == 1) {
                xPos = xPos + speed;
            }

            if (richtungy == -1) {
                yPos = yPos - speed;
            } else if (richtungy == 0) {
                yPos = yPos;
            } else if (richtungy == 1) {
                yPos = yPos + speed;
            }

        }
    }

    public void drawBall(Graphics g) {
        g.setColor(farbe);
        g.fillOval(xPos - radius, yPos - radius, 2 * radius, 2 * radius);
    }
}

Java:
import java.awt.Color;
import java.awt.Toolkit;
import javax.swing.JFrame;

class Spiel {
    public Spiel() {
        Main m  = new Main();
        m.backimage = Toolkit.getDefaultToolkit().getImage("bg.jpg");
        m.ball = new Ball(3, "vor", "vor", Color.red);
        JFrame frame1 = new JFrame("Spiel");
        frame1.setSize(800, 600);
        frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame1.add(m);
        frame1.addKeyListener(m);
        frame1.setVisible(true);
        m.run();
 
    }
 
    public static void main(String[] args) {
        new Spiel();
    }
}

Liegt es wieder daran, dass ich das Spiel in einem JFrame ausführe?


||edit: Sehe selbst schon viele Sachen die nicht funktionieren können, jetzt wo ich drübergucke. Aber irgendwas müsste ja trotzdem angezeigt werden oder?!
|||edit: Habe das was ich gesehen habe verbessert
 
Zuletzt bearbeitet:

julian.veh

Bekanntes Mitglied
Den Code habe ich schonmal verbessert ;)
Der Ball wird ja nun angezeigt, aber er bewegt sich nicht. Habe mal

Java:
  public void run() {
        while(true) {
            ball.move(richtungx, richtungy);
            System.out.println("es geht");
            repaint();
            System.out.println("das geht");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                
            }
        }
    }

2 System.outs gemacht, aber nichts wird angezeigt, deswegen denke ich liegt es an der methode run. Aber die rufe ich doch in Spiel() nach sichtbarmachen des Frames auf. Und die Bedingung true ist auch korrekt.
Habe keine Idee was falsch sein könnte. Kann mir jemand auf die Sprünge helfen?

Wenn ich vor move(..) was ausgebe, funktioniert es, also wird der fehler wohl in der Methode liegen..


||edit: es geht, habe vergessen die whileschleife in der methode move() zu entfernen ;D

Grüße
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen GlassPane mit KeyListener Java Basics - Anfänger-Themen 1
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
J-Gallus Keylistener verstehen Java Basics - Anfänger-Themen 17
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
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

Ähnliche Java Themen

Neue Themen


Oben