keyListener - Genau 1 Aktion soll bei 1 Tastenausdruck ausgeführt werden

Jack159

Bekanntes Mitglied
Hallo,

Sobald der Benutzer z.b. die Taste "F" drückt, soll (nur!) ein einziges mal die Meldung "F wurde gedrückt" ausgegeben werden.
Mein Problem ist aber, dass wenn man auf 1x "F" tippt, dutzende male die Meldung "F wurde gedrückt" ausgegeben wird, da ich genau genommen ja nicht 1x tippe, sondern die Taste ja einen gewissen Zeitraum aktiviert ist.

Wie krieg ich es aber hin, dass pro Tastendruck nur auch jeweils 1x etwas geschieht?

Wenn ich es mit keyTyped() probiere, passiert überhaupt nichts...
Momentan läufts mit keypressed() (boolean x=true) und keyreleased() (boolean x= false) und eben einer if(x) dann "F wurde gedrückt"...
 

HimBromBeere

Top Contributor
Schreib mal bissl Code, wo du dein x prüfst.

EDIT:
Java:
public void keyPressed(KeyEvent e) {
	 switch (e.getKeyCode()) {
	 	case KeyEvent.VK_F:
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Momentan läufts mit keypressed() (boolean x=true) und keyreleased() (boolean x= false) und eben einer if(x) dann "F wurde gedrückt"...
Warum mit dem boolean? Läuft die Ausgabe in einer Schleife in einem anderen Thread?
Warum nicht einfach in der keyPressed auf F prüfen und die Ausgabe machen? Die Methode wird nämlich nur einmal aufgerufen, wenn die Taste gedrückt wurde.
 

Jack159

Bekanntes Mitglied
Warum mit dem boolean? Läuft die Ausgabe in einer Schleife in einem anderen Thread?
Warum nicht einfach in der keyPressed auf F prüfen und die Ausgabe machen? Die Methode wird nämlich nur einmal aufgerufen, wenn die Taste gedrückt wurde.

Nein, es läuft alles im selben Thread.
Also ohne boolean klappt es, wenn man wirklich nur 1x kurz die Taste antippt (Besser auf jeden Fall schonmal als vorher)!

Nur wenn man die Taste F etwas länger gedrückt hält, wird trozdem dutzende male die Methode ausgeführt.
Gibts eine Möglichkeit, dass die Methode wirklich nur 1x ausgeführt wird (auch wenn ich die Taste gedrückt halte) und erst wieder erneut ausgeführt wird, wenn die Taste losgelassen wurde, und anschließend wieder erneut gedrückt wird?

Hintergrund es ganzen:
Ich will ein Space Invanders programmieren. Wenn man z.b. auf F (für schießen) drückt/gedrückt hält, dann soll nur genau 1 Schuss kommen.


Hier der Code:



Hier steht der relevante Code drinnen (Ab Zeile 59 kommen die keylistener):
Java:
package A;

import java.awt.Color;
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.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class StartPanel extends JPanel implements KeyListener, ActionListener {
	
	
	Timer t = new Timer(5, this);
	
	public int x = 200;
	public int y = 200;
	public int dx = 0;
	public int dy = 0;
    boolean links = false;
    boolean rechts = false;
    boolean oben = false;
    boolean unten = false;
   
 
	
	public StartPanel(JFrame frame1) {
		
		
		frame1.add(this);
		setFocusable(true);
		addKeyListener(this);
		
		t.start();
		
		
		
	}
	
	
	public void paintComponent(Graphics g) {
	     super.paintComponent(g);            
	     Graphics2D g2 = (Graphics2D) g;
	     Ellipse2D circle = new Ellipse2D.Double(x, y, 40, 40);
	     g2.fill(circle);
	     
	  
	     
	     t.start();
	   }


	public void keyPressed(KeyEvent e) {
		
		int code = e.getKeyCode();
		
		if(code==KeyEvent.VK_UP) {
			oben = true;
			
		} else if(code==KeyEvent.VK_DOWN) {
			unten = true;
			System.out.println("UNTEN");
			
		} else if(code==KeyEvent.VK_RIGHT) {
			rechts = true;
			
			
		} else if(code==KeyEvent.VK_LEFT) {
			links = true;
			
		}
		

		
	      if(code==70) {
	    	  System.out.println("F wurde gedrückt");
	      }
		
	}

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

	}

	
	public void keyTyped(KeyEvent e) {
		int code = e.getKeyCode();
	

	}


	@Override
	public void actionPerformed(ActionEvent e) {

		if(oben) {
            dy = -1;
            dx = 0;
            
        }
    
        if(unten) {
        	dy = 1;
        	dx = 0;
        }
        
        if (links) {
        	dy = 0;
        	dx = -1;
        }
        
        if (rechts) {
        	dy = 0;
        	dx = 1;
        }
        

        
   
        
        x +=dx;
        y +=dy;
        repaint();
        dx = 0;
        dy = 0;
	
	}

}

Java:
package A;

import javax.swing.JFrame;

public class StartFrame extends JFrame {
	
	
	
	public StartFrame(int x, int y, String titel) {
		
		this.setSize(x, y);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle(titel);
		this.setLocation(500, 200);
		
	}

}

Java:
package A;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;



public class Start {
	
	
	
	public static void main(String[] args) {
		
		StartFrame frame = new StartFrame(1000, 600, "Start");
		StartPanel panel = new StartPanel(frame);
		
		
		
		
	}

	
	
	

}
 

HimBromBeere

Top Contributor
Warum leitest du dein keyPressed nicht einfach an keyReleased weiter? So wie du´s jetzt hast, wird ein un der selbe Code zumindest schonmal zweimal ausgeführt, einmal in keyPressed, einmal in keyReleased

EDIT: Oh, hab´s gefunden... hat sich erldigt.... einfach ignorieren

EDIT: Kann es sein, dass es am Timer liegt? Denn der wird ja 5ms lang ausgeführt und prüft in dieser Zeit sicherlich öfter als nur einmal, ob oben wahr ist...

EDIT: Du kannst übrigens sinnvollerweise deine Richtungsangaben auf wenigstens zwei reduzieren: vertikal -1, 0 oder +1 und horizontal -1, 0 oder 1
 
Zuletzt bearbeitet:

Jack159

Bekanntes Mitglied
Am Timer liegts nicht. Selbst wenn ich 1 Sekunde beim Timer Einstelle, kommt zig mal die Meldung "F wurde gedrückt" wenn ich F gedrückt halte, der Kreis jedoch bewegt sich nur jede 1 Sekunde weiter.
 

Jack159

Bekanntes Mitglied
Nein das hat damit nichts zu tun.

Starte das Programm mal ruhig und teste es aus.

Ohne den Timer würde die Bewegung des Balles ziemlich komisch/unflüssig/hackelig wirken.
 

SSAT

Mitglied
Keypressed() nur einmal aufzurufen wird wohl nicht gehen. Unter Windows hat man beim Gedrückthalten einer Taste immer den folgenden Ablauf:

keyPressed()
keyPressed()
...
keyReleased()

Es wird immer ständig keypressed aufgerufen, solange bis man die Taste loslässt. Unter Linux ist es noch schlimmer. Da hat man folgenden Ablauf:

keyPressed()
keyReleased()
keyPressed()
keyReleased()
...

Lösungen für das Problem gibt es auch. Google mal nach TimedKeyListener. Es gibt noch andere Methoden, die ich allerdings nicht mehr kenne -> Google nach "keypressed + Linux" oder so etwas ähnliches.
 

Michael...

Top Contributor
Sorry meine gestrige Aussage war falsch. (zur Verteidigung ;-) :nutzte eigentlich keine KeyListener)

Für solche Zwecke verwende ich Key Bindings. Hier mal ein Bsp. wie man das Problem mit Hilfe eines Flags lösen könnten. (Hätte eigentlich erwartet, das keyTyped(KeyEvent), diesen Zweck erfüllt)

Die statische boolean Variable ist nur zur Demo, im Produktivumfeld bitte eine Instanzvariable daraus machen:
Java:
	static boolean toBeReleased = false;

	public static void main(final String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 300, 300);
		JPanel panel = new JPanel();
		frame.add(panel);
		frame.setVisible(true);

		InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F, 0), "fPressed");
		inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F, 0, true), "fReleased");
		panel.getActionMap().put("fPressed", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				if (!toBeReleased) {
					System.out.println("F");
					toBeReleased = true;
				}
			}
		});
		panel.getActionMap().put("fReleased", new AbstractAction() {
			public void actionPerformed(ActionEvent e) {
				toBeReleased = false;
			}
		});
	}
 
Ä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
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
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