webForumDet fria alternativet

Tangentlyssnare

6 svar · 355 visningar · startad av Brimba

BrimbaMedlem sedan dec. 19992 966 inlägg
#1

Hej!

Hur kopplar jag på en tangentlyssnare på ett fönster?

Jag har en vanlig klass med en mainmetod. I mainmetoden ritas det ut lite saker, och när jag kör manuellt, exempelvis t1.walk() så går det utmärkt, men jag vill att den skall köra t1.walk() när en speciell knapp trycks ner.

Om jag försöker köra exempelvis

public class Wee implements ActionListener, eller
public class Wee implements KeyListener
Så får jag följande fel:

Wee should be declared abstract; it does not define keyPressed(java.awt.event.KeyEvent) in Wee

phonkworksMedlem sedan juli 2001228 inlägg
#2

Lyssnar interface är ganska jobbiga för man måste överlagra alla "tomma" metoder. Kör KeyAdapter i stället men eftersom det är en klass så ärver man den istället för implementerar.

Sen för att få bort allt strul med att blanda in statiska och icke statiska metoder så skriv en vanlig konstruktor där du skapar fönster, kopplar på lyssnaren etc .. plus att bara skriva new Wee() i main.

Lägg till metoden

public void keyTyped(KeyEvent ev) {
	// det som ska hända när du trycker på knappar
}

i klassen och för att koppla in lyssnaren gör du en
komponenten.addKeyListener(this);

Sen ska det bara va att åka!

BrimbaMedlem sedan dec. 19992 966 inlägg
#3

Jag får hela tiden "cannot resolve symbol", när jag försöker köra w1.addKeyListener(this);

w1 är ett fönster.

Jag har ärvt KeyAdapter och lagt till en voidmetod keyTyped, samt lagt in fönsterskapandet i konstruktorn, och anropar den i mainmetoden.

phonkworksMedlem sedan juli 2001228 inlägg
#4

Skulle du kunna posta hela koden? Så kan jag kolla...

mvh
phonk

BrimbaMedlem sedan dec. 19992 966 inlägg
#5

Du har ett PM :)

BrimbaMedlem sedan dec. 19992 966 inlägg
#6

Det är såhär att jag har en redan färdig hjälpklass som hjälper mig att skapa ett fönster.
Den hjälpklassen har redan diverse metoder och annat.

Först har den
private KeyEventHandler keyHandler; som instansvariabel
Därefter i konstruktorn görs bland annat detta

MenuItem fileQuit = new MenuItem("Quit",new MenuShortcut(KeyEvent.VK_Q));
fileQuit.addActionListener(new MenuEventHandler());
keyHandler = new KeyEventHandler();

Sedan finns det lite publika metoder, exempelvis:

public void waitForEvent() {
frame.getToolkit().sync();
canvas.addMouseListener(mouseHandler);
canvas.addKeyListener(keyHandler);

lastEvent = eventQueue.getNextEvent();
if (lastEvent.getID()==KeyEvent.KEY_TYPED) {
  eventType = 1;
  key = ((KeyEvent) lastEvent).getKeyChar();
}
else if (lastEvent.getID()==MouseEvent.MOUSE_PRESSED) {
  eventType = 2;
  mouseX = ((MouseEvent) lastEvent).getX();
  mouseY = ((MouseEvent) lastEvent).getY();
  if (((MouseEvent) lastEvent).isMetaDown())
    mouseButton = 3;
  else if (((MouseEvent) lastEvent).isAltDown())
    mouseButton = 2;
  else
    mouseButton = 1;
} 

canvas.removeMouseListener(mouseHandler);
canvas.removeKeyListener(keyHandler);

}

public int getEventType() {
return eventType;
}

public char getKey() {
return key;
}

Det märkliga är nu att när jag anropar waitForEvent och rör/trycker på musen så returneras en 2:a, men när jag trycker på knappar på tangentbordet så returneras ingenting och när jag försöker avläsa getKey() så returnerar den heller ingenting.

Hur kan jag koppla en lyssnare till mitt fönster när den redan lyssnar, men vägrar inse att det är tangentbordet den skall lyssna på?

Några tips?

LimeMedlem sedan sep. 2001837 inlägg
#7

Hehe... Det där har jag svarat på en gång redan... :-)

Hemligheten ligger i att veta hur Java's Event är implementerat.

Om man kollar på koden till t.ex. JTextArea så får man svaret... Om man inte orkar göra det så frågar man någon som redan kollat.

Det man måste göra är att koppla keyListener till Framen och inte till Canvas. Det har att göra med hur Event bubblas upp och ner i hierarkin.

/Lime

Genererad på 380 ms · cache AV · v20260730165559-full.f96bc7eb