webForumDet fria alternativet

Problem med addKeyListener

4 svar · 328 visningar · startad av xtian

xtianMedlem sedan nov. 200510 inlägg
#1

Jag har ett problem som jag inte kan hitta någon lösning på. Jag har 2 stycken klasser, MyFrame och MyPanel, som ärver från JFrame resp. JPanel. I klassen MyPanel som jag skapar ett objekt av i klassen MyFrame vill jag lägga till en tangenbordslyssnare som känner av shift-knappen. Detta gör jag med kodstycket nedan som läggs i konstruktorn. Får inga problem vid kompileringen men inget händer när jag trycker på shift-knappen under körning av programmet. Om jag däremot lägger satserna i MyFrame klassen så fungerar det utmärkt. Någon som vet vad det beror på och kanske kan ge mig en lösning?

Anledningen till att jag vill att tangentbordslyssnaren ska ligga i klassen MyPanel är att om jag nu skulle vilja uttnyttja den klassen i något annat program så vill jag ju självklart att tangentbordskommandona också ska fungera.

import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;

addKeyListener(
new KeyAdapter()
{
public void keyPressed( KeyEvent e )
{
if( e.isShiftDown() )
{
System.out.println("shit active");
}
}

public void keyReleased( KeyEvent e )
{
if( !e.isShiftDown() )
{
System.out.println( "shit relesed" );
}

}
}
);

phonkworksMedlem sedan juli 2001228 inlägg
#2

Kan vara ett fokus problem. Se till att din Panel har focus och pröva igen.

Mvh
phonkelito

xtianMedlem sedan nov. 200510 inlägg
#3

Tack för ditt förslag, provade att lägga till grabFocus() och requestFocusInWindow() i panelklassen men det hjälpte inte heller. Kan tillägga att jag i panelklassen dessutom har en muslyssnare som fungerar utmärkt. Så jag vet inte alls varför tangentborslyssnaren inte fungerar.

Mvh
xtian

LimeMedlem sedan sep. 2001961 inlägg
#4

Det har med Event-bubbling att göra. Om du vill att JPanel ska få keyEvents så måste du säga att JFrame skall skicka vidare eventen till underliggande komponenter... men det är bara krånligt.

Hela problemet ligger i focus managern som är lite jobbig.

Kolla på http://java.sun.com/docs/books/tutorial/uiswing/misc/keybinding.html hur man använder keybindings istället. Det är en enklare och bättre lösning.

xtianMedlem sedan nov. 200510 inlägg
#5

Det visar sig tillslut att det ändå var ett fokusproblem. Fick lägga in requestFocusInWindow() i muslyssnaren och då kände panelen av tengentbordstryckningarna.

Tack för all hjälp här..

Mvh
xtian

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)