Gå til innhold

KeyListener fungerer ikke


Anbefalte innlegg

Sitter her og prøver å gjøre ferdig et spillprosjekt der jeg har bruk for KeyListener. Problemet er bare at absolutt ingenting skjer :( . Er ikke det riktig gjort å implementere på følgende måte?

Her er et lite utdrag fra koden:

 

public class Canvas extends JFrame implements KeyListener
{
public Canvas()
{

	//kode..............




	[b]addKeyListener(this);[/b]
}

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

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

public void keyReleased(KeyEvent e)
{
	System.out.println("test3");
}	
}

 

Kanskje verdt å nevne at jeg også bruker en anonym privat klasse som implementerer ActionListener inni Canvas. Kan denne ha noe med dette å gjøre?

Endret av dejanV
Lenke til kommentar
Videoannonse
Annonse

Resten av koden, sørger den for at denne JFrame-en blir vist? Koden nedenfor er ikke mer meningsfull, men keylistener-metodene funker.

 

 

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

import javax.swing.JFrame;

public class Canvas extends JFrame implements KeyListener
{	
public Canvas()
{
	//kode..............
	addKeyListener(this);
}

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

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

public void keyReleased(KeyEvent e)
{
	System.out.println("test3");
}   

public static void main(String[] args) {
	Canvas c = new Canvas();
	c.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	c.setVisible(true); 	
}   

}

 

Lenke til kommentar

Problemet ditt er: "//kode.............."

 

Jeg aner ikke hva slags tull du har her, men det er garantert en eller annen component som tar fokuset bort fra JFrame. I eksemplet over er det ikke noe content, så det er ingen som stjeler fokusen din, altså den virker.

 

Alternativ måte å få dette til samtidig som du ignorerer fokus aspektet:

getRootPane().registerKeyboardAction(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent e) {
			System.out.println("Tadaa!");
		}
	}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);

 

 

Men jeg antar at dette ikke er bra nok og er ute etter pressed of released eventene til dette kinetiske prosjektet ditt, så jeg foreslår:

	public Canvas() {

	//kode..............
	KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KineticKeyEventDispatcher());
}



private final static class KineticKeyEventDispatcher implements KeyEventDispatcher {
	private static char c;
	private static long time;
	private static boolean released = true;

	@Override
	public boolean dispatchKeyEvent(final KeyEvent e) {
		if (e.getID() == KeyEvent.KEY_PRESSED) {
			if (released) {
				released = false;
				c = e.getKeyChar();
				time = System.currentTimeMillis();
			}
		} else if (e.getID() == KeyEvent.KEY_RELEASED) {
			if (!released && c == e.getKeyChar()) {
				released = true;
				System.out.println("Key " + c + " pressed for " + (System.currentTimeMillis() - time) + "ms");
			}
		}
		return false;
	}
}

 

Eksempel:

Key t pressed for 88ms

Key a pressed for 73ms

Key d pressed for 80ms

Key a pressed for 48ms

Key a pressed for 48ms

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...