KeyListener (keyTyped) funktioniert nicht

Jack159

Bekanntes Mitglied
Ich habe hier ein kleines GUI-Programm, bei dem man einen schwarzen Kreis mit den Pfeiltasten auf dem Frame steuern kann. Momentan benutze ich die keyPressed() Methode, welche bewirkt, dass bei einem Druck auf die Pfeiltaste der Ball in Bewegung gesetzt wird.
Mein Ziel ist es aber, dass sich der Ball nur bewegt, soland die jeweilige Pfeiltaste gedrückt bleibt. Wird sie losgelassen, soll der Ball auch stehen bleiben.
Dafür wäre die keyTyped() Methode geeignet. Wenn ich diese aber statt der keyPressed() Methode benutze, dann bewegt sich der Ball nicht...

Hier der Code mit der nicht funktionierenden keyTyped() Methode:

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;

import javax.swing.*;

public class second extends JPanel implements ActionListener, KeyListener {
	
	Timer t = new Timer(5, this);
	double x = 300, y = 300, velx = 0, vely = 0;
	
	public second() {
		t.start();
		addKeyListener(this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(false);
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.fill(new Ellipse2D.Double(x, y, 40, 40));
	}
	public void actionPerformed(ActionEvent e) {
		
		if(x >= 750 | x <= 10) {
			velx = -velx;
		}
		
		if(y >= 525 | y <= 10) {
			vely = -vely;
		}
		
		repaint();
		x +=velx;
		y +=vely;
	}
	public void up() {
		vely = -1.5;
		velx = 0;
	}
	public void down() {
		vely = 1.5;
		velx = 0;
	}
	public void left() {
		vely = 0;
		velx = -1.5;
	}
	public void right() {
		vely = 0;
		velx = 1.5;
	}
	public void keyPressed(KeyEvent e) {
		int code = e.getKeyCode();
		if(code == KeyEvent.VK_UP){
			up();
		}
		if(code == KeyEvent.VK_DOWN){
			down();
		}
		if(code == KeyEvent.VK_RIGHT){
			right();
		}
		if(code == KeyEvent.VK_LEFT){
			left();
		}
	}
	
	 // public void keyPressed(KeyEvent e) {}
     public void keyTyped(KeyEvent e) {}
     public void keyReleased(KeyEvent e) {}
}

Java:
import javax.swing.JFrame;

public class Macheads {

	public static void main(String[] args) {
		JFrame f = new JFrame();
		second s = new second();
		f.add(s);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(800, 600);
	}
}
 
G

Gast2

Gast
bezüglich deines klassennamens nochmal:
http://www.java-forum.org/java-basi...92-man-alles-klasse-schreiben.html#post778280

Zu deinem Problem:
du solltest das ganze etwas anders aufziehen. Für jede der 4 tasten hast du einen boolean.
Diesen setzt du auf true sobald die taste gedrückt und auf false sobald sie losgelassen wird.
in deinem "gameloop", in deinem fall die actionPerformed methode prüfst du dann welche booleans auf true sind und veränderst die position des balles.
 

thewulf00

Bekanntes Mitglied
Genau das eben angesprochene Prinzip hab ich bei meinem Spiel angewandt:

Java:
public class PlayerController extends Behavior implements ActionListener
{
    private static int char_w = 87;
    private static int char_a = 65;
    private static int char_s = 83;
    private static int char_d = 68;

    private Map<Integer, Boolean>  isPressed = new HashMap<Integer, Boolean>(4);    

    public PlayerController(...)
    {
        super();

        isPressed.put(char_w, false);
        isPressed.put(char_a, false);
        isPressed.put(char_s, false);
        isPressed.put(char_d, false);

        ...
    }


    // Wird beim Tastendruck aufgerufen (Behavior.processStimulus)
    private void doProcess(InputEvent evt)
    {
        KeyEvent e;
        int      key;
                
        switch (evt.getID())
        {
            case KeyEvent.KEY_PRESSED:
                e   = (KeyEvent) evt;
                key = e.getKeyCode();
                if (isPressed.containsKey(key))
                    if (!isPressed.get(key))
                        isPressed.put(key, true);

                break;
                
            case KeyEvent.KEY_RELEASED:
                e   = (KeyEvent) evt;
                key = e.getKeyCode();
                if (isPressed.containsKey(key))
                    isPressed.put(key, false);

                break;
        }
    }
    
    // Vom Timer aufgerufen:
    @Override
    public void actionPerformed(ActionEvent e)
    {
        if (isPressed.get(char_w))
            ...

        if (isPressed.get(char_a))
            ...
                
        if (isPressed.get(char_s))
            ...
                
        if (isPressed.get(char_d))
            ...                
    }
}
 

Jack159

Bekanntes Mitglied
bezüglich deines klassennamens nochmal:
http://www.java-forum.org/java-basi...92-man-alles-klasse-schreiben.html#post778280

Zu deinem Problem:
du solltest das ganze etwas anders aufziehen. Für jede der 4 tasten hast du einen boolean.
Diesen setzt du auf true sobald die taste gedrückt und auf false sobald sie losgelassen wird.
in deinem "gameloop", in deinem fall die actionPerformed methode prüfst du dann welche booleans auf true sind und veränderst die position des balles.

Sry ich war etwas länger inaktiv und konnte erst jetzt wieder weitermachen.

Ich habe es jetzt so gemacht, wie du sagst, aber wenn ich jetzt das Programm starte, bewegt sich der Ball sofort nach rechts und verschwindet aus dem Fenster rechts, ohne dass ich irgendeine Tatse drücke. :bahnhof: Ich weiß echt nicht, wo da der Fehler sein soll...

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;

import javax.swing.*;

public class Second extends JPanel implements ActionListener, KeyListener {
	
	Timer t = new Timer(5, this);
	double x = 300, y = 300, velx = 0, vely = 0;
	boolean links = false;
	boolean rechts = false;
	boolean oben = false;
	boolean unten = false;
	
	public Second() {
		t.start();
		addKeyListener(this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(false);
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.fill(new Ellipse2D.Double(x, y, 40, 40));
	}
	public void actionPerformed(ActionEvent e) {
		
		if(x >= 750 | x <= 10) {
			velx = -velx;
		}
		
		if(y >= 525 | y <= 10) {
			vely = -vely;
		}
		
		
		
		if(oben = true) {
			vely = -1.5;
			velx = 0;
			
		}
	
		if(unten = true) {
			vely = 1.5;
			velx = 0;
		}
		
		if (links = true) {
			vely = 0;
			velx = -1.5;
		}
		
		if (rechts = true) {
			vely = 0;
			velx = 1.5;
		}
		repaint();
		x +=velx;
	    y +=vely;
	}
	
	


	public void keyTyped(KeyEvent e) {
		int code = e.getKeyCode();
		if(code == KeyEvent.VK_UP){
			oben = true;
		}
		
		
		if(code == KeyEvent.VK_DOWN){
			unten = true;
		}
		
		
		if(code == KeyEvent.VK_RIGHT){
			rechts = true;
		}
		
		
		if(code == KeyEvent.VK_LEFT){
			links = true;
		}
		
		
	}
    public void keyReleased(KeyEvent e) {
    	int code = e.getKeyCode();
		if(code == KeyEvent.VK_UP){
			oben = false;
		}
		
		
		if(code == KeyEvent.VK_DOWN){
			unten = false;
		}
		
		
		if(code == KeyEvent.VK_RIGHT){
			rechts = false;
		}
		
		
		if(code == KeyEvent.VK_LEFT){
			links = false;
		}
    	
    	
    }
    public void keyPressed(KeyEvent e) {}
}

Und hier die Frame Klasse (nebensächlich)
Java:
import javax.swing.JFrame;

public class Macheads {

	public static void main(String[] args) {
		JFrame f = new JFrame();
		Second s = new Second();
		f.add(s);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(800, 600);
	}
}

@ thewulf00:
Danke für deine Hilfe, aber deinen Code verstehe ich kaum. Da finde ich meinen irgendwie leichter/verständlicher (zumindest für mich^^)
 
G

Gast2

Gast
Java:
if(oben = true) {
Das ist ne Zuweisung, kein vergleich.
 

Jack159

Bekanntes Mitglied
Java:
if(oben = true) {
Das ist ne Zuweisung, kein vergleich.

Habe es nun geändert, aber jetzt tut sich garnichts, wenn ich das Programm starte. Der Ball bewegt sich nicht, wenn ich auf die Pfeiltasten drücke bzw. sie gedrückt halte.

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
 
import javax.swing.*;
 
public class Second extends JPanel implements ActionListener, KeyListener {
    
    Timer t = new Timer(5, this);
    double x = 300, y = 300, velx = 0, vely = 0;
    boolean links = false;
    boolean rechts = false;
    boolean oben = false;
    boolean unten = false;
    
    public Second() {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.fill(new Ellipse2D.Double(x, y, 40, 40));
    }
    public void actionPerformed(ActionEvent e) {
        
        if(x >= 750 | x <= 10) {
            velx = -velx;
        }
        
        if(y >= 525 | y <= 10) {
            vely = -vely;
        }
        
        
        
        if(oben == true) {
            vely = -1.5;
            velx = 0;
            
        }
    
        if(unten == true) {
            vely = 1.5;
            velx = 0;
        }
        
        if (links == true) {
            vely = 0;
            velx = -1.5;
        }
        
        if (rechts == true) {
            vely = 0;
            velx = 1.5;
        }
        repaint();
        x +=velx;
        y +=vely;
    }
    
    
 
 
    public void keyTyped(KeyEvent e) {
        int code = e.getKeyCode();
        if(code == KeyEvent.VK_UP){
            oben = true;
        }
        
        
        if(code == KeyEvent.VK_DOWN){
            unten = true;
        }
        
        
        if(code == KeyEvent.VK_RIGHT){
            rechts = true;
        }
        
        
        if(code == KeyEvent.VK_LEFT){
            links = true;
        }
        
        
    }
    public void keyReleased(KeyEvent e) {
        int code = e.getKeyCode();
        if(code == KeyEvent.VK_UP){
            oben = false;
        }
        
        
        if(code == KeyEvent.VK_DOWN){
            unten = false;
        }
        
        
        if(code == KeyEvent.VK_RIGHT){
            rechts = false;
        }
        
        
        if(code == KeyEvent.VK_LEFT){
            links = false;
        }
        
        
    }
    public void keyPressed(KeyEvent e) {}
}
 
G

Gast2

Gast
Durch ein Sysout hättest du gesehen, dass keyTyped bei Pfeiltasten z.b. nicht anspricht (macht ja auch irgendwie sinn ;) ). Setz den Code ins keyPressed.

Java:
if(oben == true) {
Mach daraus besser
Java:
if(oben) {
 

Jack159

Bekanntes Mitglied
Durch ein Sysout hättest du gesehen, dass keyTyped bei Pfeiltasten z.b. nicht anspricht (macht ja auch irgendwie sinn ;) ). Setz den Code ins keyPressed.

Das funktioniert zwar, aber damit bin ich wieder bei meinem ursprünglichen Problem.
Wenn ich nun z.b. auf Pfeiltaste links drücke und diese wieder loslasse, dann bewegt sich der Ball nun die ganze Zeit nach links (an der Wand prallt er wieder ab).
Ich möchte aber, dass sich der Ball nur dann bewegt, wenn ich die Pfeiltaste links gedrückt halte.
Stell dir das wie ein PC-Spiel vor, wo du die Spielfigur mit den Pfeiltasten steuerst. Die Figur bewegt sich nur, wenn du die jeweilige Taste gedrückt hälst.
 
G

Gast2

Gast
Ja überleg dir mal woran das liegen könnte.
Du drückst LINKS, left wird auf true gesetzt. Deine Gameloop läuft durch und setzt
Code:
velx = -1.5;
. Dann lässt du LINKS los, left wird auf false gesetzt. Was passiert in deiner Gameloop? Was passiert mit dem Wert velx?
 

Jack159

Bekanntes Mitglied
Ja überleg dir mal woran das liegen könnte.
Du drückst LINKS, left wird auf true gesetzt. Deine Gameloop läuft durch und setzt
Code:
velx = -1.5;
. Dann lässt du LINKS los, left wird auf false gesetzt. Was passiert in deiner Gameloop? Was passiert mit dem Wert velx?

Stimmt. Funktioniert jetzt einwandfrei. Danke nochmals für deine Hilfe ;)
Hier die Lösung (Falls es irgendwen intressiert^^)

Der Fehler lag in der GameLoop bzw. actionPerformed. Am Ende der Schleife einfach velx und vely wieder auf 0 setzen.
Java:
public void actionPerformed(ActionEvent e) {
        
        if(x >= 750 | x <= 10) {
            velx = -velx;
        }
        
        if(y >= 525 | y <= 10) {
            vely = -vely;
        }
        
        
        
        if(oben) {
            vely = -1.5;
            velx = 0;
            
        }
    
        if(unten) {
            vely = 1.5;
            velx = 0;
        }
        
        if (links) {
            vely = 0;
            velx = -1.5;
        }
        
        if (rechts) {
            vely = 0;
            velx = 1.5;
        }
        
        x +=velx;
        y +=vely;
        repaint();
        velx = 0;
        vely = 0;
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
hdi KeyListener : keyTyped() nicht nutzbar? 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
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
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
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