Mein Keylistener funktioniert nicht

DarkBioHazard

Grünschnabel
hi,
ich habe ein problem mit meinem keylistener in einem applet. ich plane einen wallbraker zu schreiben und will das pad mit den pfeiltasten bewegen. hier die relevanten teile des codes:
(der fehler liegt nicht in den methoden, die über den keylistener aufgerufen werden sollen, da ich sie testweise mit buttons aufrufen kann und alles funktioniert)

implementation:
...
public class SpielfeldA extends Applet
{
...
public void init()
{
this.addKeyListener(new TastaturabfrageA(this));
...
der Keylistener selbst:
import java.awt.event.*;

public class TastaturabfrageA implements KeyListener
{
private SpielfeldA sp;

public TastaturabfrageA(SpielfeldA sp)
{
this.sp = sp;
}

public void keyPressed(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
}

public void keyTyped(KeyEvent e)
{
if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED)
{
sp.keyPressed(e.getKeyChar());
}
}
}
und die aufgerufene Methode:
public void keyPressed(char c)
{
switch (c) {
case (char) 26: //Pfeiltaste rechts
pad.bewegeRechts();
break;
case (char) 27: //Pfeiltaste links
pad.bewegeLinks();
break;
}
}
ich kriege keine fehlermeldung, es tut sich einfach nur garnichts.
Falls es ein dummer fehler ist, bitte nicht aufregen :) ich lerne erst seit einem jahr java in der schule

schonmal danke im vorraus
 
So ein paar Kleinigkeiten schonmal:
Wallbraker ist doch das Spiel wo man oben die Steine mit einem Ball zerschießen muss oder? Wenn ja, dann ist es schonmal ungünstig keyTyped zu verwenden, denn die Methode wird soweit ich weiß erst aufgerufen wenn die Taste wieder losgelassen wird - du müsstest also ganz oft drauf drücken und könntest die Taste nicht gedrückt halten..

Zum anderen muss das Applet auch den Fokus im Webbrowser haben damit es KeyEvents annimmt (das weißt du vermutlich schon - nur um alle möglichen Fehlerquellen auszuschließen) - deshalb musst du einmal ins Applet klicken bevor Tastureingaben angenommen werden..

Hoffe das hilft dir schonmal ein bissel..

Gruß
Tobias

P.S. Ich hab vor langer Zeit mal ein Pong programmiert und bin nach viel herumprobieren dazu übergegangen eine Haupt-Nachrichten-Schleife zu verwenden (So wie es auch in C++-Programmen üblich ist..
Wenn die jeweiligen KeyEvents ausgelöst werden veränderst du einfach nur einen boolean(Taste gedrückt - true/false) und veränderst die Koordinaten dann in der Hauptschleife.. Hat den Vorteil das du sehr gut steuern kannst wie schnell sich das Pad letztendlich bewegen soll
 
Nabend DarkBioHazard.

Ersteinmal muss ich Tobias zusprechen, ich würde dir auch raten die empfangenen KeyEvents in irgendeiner art zu kodieren und dann diese Variablen abzufragen.

Du willst doch bestimmt das pad.bewegeRechts() so lange ausgeführt wird wie die Taste gedrückt wird oder?

Code:
boolean links = false;
boolean rechts = false;

public void keyPressed(KeyEvent keyEvent) {
		// Die Methode interpretiert gedrückte Tasten 

		if (keyEvent.getKeyCode() == KeyEvent.VK_RIGHT)
			rechts = true;
		if (keyEvent.getKeyCode() == KeyEvent.VK_LEFT)
			links = true;
}

public void keyReleased(KeyEvent keyEvent) {
		// Die Methode interpretiert losgelassene Tasten

		if (keyEvent.getKeyCode() == KeyEvent.VK_RIGHT)
			rechts = false;
		if (keyEvent.getKeyCode() == KeyEvent.VK_LEFT)
			links = false;
}

public int getAktion() {
		if (rechts) return 1;
		else if (links) return 2;
		else return 0;
}

So, jetzt kannst du aus der Hauptschleife in der dein spiel abläuft halt sowas wie:

Code:
switch (TastaturabfrageA.getAktion()) {

   case 1:
   pad.bewegeRechts();
   break;

   case 2:
   pad.bewegeRechts();
   break;
}

Wizo es bei dir nicht geht weiss ich nicht genau. Wenn ich Sondertasten abfrage mach ich das mit den Virtuellen Keycodes (Das sind die VK_* dinger) vieleicht ist das problem in der zeile if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED) zu suchen. Laut JavaDoc ist ein keyEvent CHAR_UNDEFINED wenn es sich keinem UniCode zeichen zuweisen lässt. Sind die Pfeiltasten denn irgendeinem Unicode Character zugewiesen? Sondertasten sind immer so eine Sache. Wie gesagt nimm lieber die Virtuellen Keycodes.

MfG Marius
 
wie gesagt, bin noch nicht sonderlich erfahren mit java :)

also laut meiner ASCII tabelle haben die pfeiltasten folgende codes:
Pfeil oben: 24
Pfeil unten: 25
Pfeil rechts: 26
Pfeil links: 27

das sind halt die dezimal codes für die zeichen, die wir auch im unterricht benutzt hatten.WIr haben sie allerdings nur für buchstaben und zahlen benutzt.

danke für die tipps, werde es gleich mal ausprobieren
 
Hallo,

schau mal hier:

Java:
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ShipTrip extends JFrame {

	private int x = 20, y = 20;

	private int[] xPoints = { 30 + x, 40 + x, 90 + x, 110 + x, 90 + x, 90 + x,
			70 + x, 70 + x, 50 + x, 50 + x, 45 + x, 45 + x, 30 + x };

	private int[] yPoints = { 50 + y, 60 + y, 60 + y, 50 + y, 50 + y, 30 + y,
			30 + y, 50 + y, 50 + y, 20 + y, 20 + y, 50 + y, 50 + y };

	private boolean[] keyPressed = new boolean[4];

	private int UP = 0, RIGHT = 1, DOWN = 2, LEFT = 3;

	private JPanel ocean = new JPanel() {
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.CYAN);
			g.fillRect(0, 0, this.getWidth(), this.getHeight());
			g.setColor(Color.LIGHT_GRAY);
			g.fillPolygon(xPoints, yPoints, 13);
		};
	};

	public ShipTrip() {
		super("Ship Trip");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		this.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				update(e, true);
			}

			public void keyReleased(KeyEvent e) {
				update(e, false);
			}

			public void update(KeyEvent e, boolean pressed) {
				if (e.getKeyCode() == KeyEvent.VK_UP)
					keyPressed[UP] = pressed;
				if (e.getKeyCode() == KeyEvent.VK_RIGHT)
					keyPressed[RIGHT] = pressed;
				if (e.getKeyCode() == KeyEvent.VK_DOWN)
					keyPressed[DOWN] = pressed;
				if (e.getKeyCode() == KeyEvent.VK_LEFT)
					keyPressed = pressed;
			}
		});

		new Thread() {
			public void run() {
				while (true) {
					y -= (keyPressed[UP] ? 5 : 0);
					x += (keyPressed[RIGHT] ? 5 : 0);
					y += (keyPressed[DOWN] ? 5 : 0);
					x -= (keyPressed ? 5 : 0);
					
					for (int i = 0; i <xPoints.length ; i++) {
						xPoints = new int []{ 30 + x, 40 + x, 90 + x, 110 + x, 90 + x, 90 + x,
								70 + x, 70 + x, 50 + x, 50 + x, 45 + x, 45 + x, 30 + x };

						yPoints = new int [] { 50 + y, 60 + y, 60 + y, 50 + y, 50 + y, 30 + y,
								30 + y, 50 + y, 50 + y, 20 + y, 20 + y, 50 + y, 50 + y };
					}
					
					ocean.repaint();

					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();

		ocean.setPreferredSize(new Dimension(480, 320));

		this.add(ocean, BorderLayout.CENTER);
		this.pack();

		this.setVisible(true);
	}

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


Vg Erdal
 
mein KeyListener funktioniert ebenfalls nicht, bzw unser Lehrer verlangt von uns ein Programm zu schreiben, indem der KeyListener vorkommt. den jedoch haben wir zuvor nie benutzt und er hat uns nich wirklich hilfen gegeben.
das is das was ich bis jezz habe.
vllt kann mir ja einer von euhc helfen, sodass mein KeyListener dann doch noch funktioniert?
Code:
 public void keyPressed(KeyEvent event) 
   {
       int yKoordinate = 460;
       int xKoordinate = 40;
       
    if (event.getKeyCode() == KeyEvent.VK_UP)                 //beim Drücken der Pfeiltaste nach oben wird
    {

    }
    else
    if (event.getKeyCode() == KeyEvent.VK_DOWN)               //beim Drücken der Pfeiltaste nach unten wird       
    { 

    }
   repaint(); 
  }    
  

  public void keyReleased(KeyEvent event)
  {
  }
 
  public void keyTyped(KeyEvent event)
  {
  }
 
Hallo,

der KeyListener muss einer Komponente hinzugefügt werden, wie der ActionListener auch.
Dann muss die Komponente den Fokus bekommen können. Das heißt, sie muss in irgendeiner Form auswählbar sein, wie ein Button oder ein Textfield.

Dann fehlt in deinem Listener noch die Logik. :)

Gruß

Sascha
 
naja das hilft mir ncih wirklich weiter :D
also oben imlpementiert is er :D
aber ich bräuchte halt generell hilfe ich kann das nich
 
Dann solltest du generell mal sagen, was du vor hast.

Die zwei if-Anweisungen die du da drin hast, fragen halt ab, ob eine bestimmte Taste gedrückt wurde.
Damit der KeyListener funktioniert, muss die Komponente auch den Fokus haben. Zum Beispiel, wenn du zwei Textfelder hast, und einer implementiert den KeyListener, dann muss dieses Textfeld auch den Fokus haben, also das Textfeld muss ausgewählt sein. Wenn das andere Textfeld gewählt ist, welches den KeyListener nicht implementiert, wird auch kein KeyListener aufgerufen.

Gruß

Sascha
 
Zurück