Archief - Java : probleem arrow keys

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

EnZyMeX

Legacy Member
Hoi

Ik moet voor school een projectje maken waarin gebruikt word gemaakt van een animatie. Nu ben ik bezig met snake te maken en dit lukt me vrij goed behalve de pijltjes op het toetsenbord gebruiken wil niet werken.

De arrow keys zijn action keys dus ik dacht gebruik te maken van het KeyPressed event maar toch maak ik blijkbaar een fout en kan ze niet vinden !
Iemand die me kan helpen ?

Code:
class ToetsenHandler extends KeyAdapter implements KeyListener{
     public void keyPressed(KeyEvent e)
     {
          s += " Down";
         int keyCode = e.getKeyCode();
         switch (keyCode){
          case KeyEvent.VK_DOWN:

              if (slang != null)
              {
                  slang.goOnder();
              }
              break;
          case KeyEvent.VK_UP:
              if (slang != null)
             {
                 slang.goBoven();
             }
              break;
          case KeyEvent.VK_LEFT:
              if (slang != null)
             {
                 slang.goLinks();
             }
              break;
          case KeyEvent.VK_RIGHT:
              if (slang != null)
              {
                 slang.goRechts();
             }
             break;
         }
         repaint();
     }
 }

Code:
public void init()
 {
     setBackground(Color.GREEN);

     start = new Button("start");
     start.addActionListener(new StartHandler());
     stop = new Button("stop");
     stop.addActionListener(new StopHandler());
     pauze = new Button("pauze");
     pauze.addActionListener(new PauzeHandler());
     eindePauze = new Button("doorgaan");
     eindePauze.addActionListener(new eindePauzeHandler());


     add(start);
     add(stop);
     add(pauze);
     add(eindePauze);

     addKeyListener(new ToetsenHandler());
     requestFocus();
 }

Bavo_acku

Legacy Member
Het zou helpen mocht je exact kunnen aanduiden waar het probleem zich voordoet. Registreren de keys? Zo ja dan werkt uw listener, zo nee, dan is het dat.

Gebruik de CODE tag ipv QUOTE voor beter overzicht.

QplQyer

Legacy Member
Probeer anders eens "requestFocusInWindow()", meestal is de focus het grote probleem bij toetsenbordtoestanden, ik zie ook niet op 't eerste zicht iets.

forloRn_

Legacy Member
Het antwoord op je vraag weet ik niet, maar je mag in ieder geval die "implements KeyListener" weglaten. KeyAdapter is een klasse die de abstracte methodes van de interface KeyListener implementeert.

EnZyMeX

Legacy Member
Bavo_acku zei:
Het zou helpen mocht je exact kunnen aanduiden waar het probleem zich voordoet. Registreren de keys? Zo ja dan werkt uw listener, zo nee, dan is het dat.

Gebruik de CODE tag ipv QUOTE voor beter overzicht.
de functie public void keyPressed(KeyEvent e) word in ieder geval niet uitgevoerd. :oink:

AcIdR3IgN

Legacy Member
Je zit toevallig niet op de HIK in Geel? In't 2de jaar ICT? Want zij doen ook zoiets.. mja zij moeten enkel een animatie maken, dus alles pixel per pixel opbouwen. :)

EnZyMeX

Legacy Member
AcIdR3IgN zei:
Je zit toevallig niet op de HIK in Geel? In't 2de jaar ICT? Want zij doen ook zoiets.. mja zij moeten enkel een animatie maken, dus alles pixel per pixel opbouwen. :)
Nee kzit int 3de jaar :) maar we krijgen nu dezelfde leerstof als jullie omdat wij in het 2de nog c++ kregen

Bavo_acku

Legacy Member
Het werkt hier dus ik kan u echt niet veel helpen. De eerste gok ligt bij verlies van focus. De component waar je de init() op uitvoert moet ten allen tijde de focus behouden, die verliest hij al door bijvoorbeeld een subcomponent te klikken, of mogelijk door een andere toe te voegen.

Zulke zaken zijn frustrerend in Java GUI, mijn oplossing bestaat er meestal uit door een thread continu focus te laten terugpakken.

QplQyer

Legacy Member
Als het om een stand-alone java applicatie gaat is dat op te lossen door uw venster naar zichzelf te laten luisteren en telkens als de muis weer in het venster komt de focus op te vragen, een extra thread lijkt me overkill en niet echt gebruiksvriendelijk om eerlijk te zijn ...
Bij een applet heb ik niet direct een idee, maar ik vermoed dat je ook wel een Listener kan gebruiken die u vertelt of de muis over de applet beweegt of niet.

EnZyMeX

Legacy Member
Bavo_acku zei:
Het werkt hier dus ik kan u echt niet veel helpen. De eerste gok ligt bij verlies van focus. De component waar je de init() op uitvoert moet ten allen tijde de focus behouden, die verliest hij al door bijvoorbeeld een subcomponent te klikken, of mogelijk door een andere toe te voegen.

Zulke zaken zijn frustrerend in Java GUI, mijn oplossing bestaat er meestal uit door een thread continu focus te laten terugpakken.

Danku wel je hebt me de oplossing gegeven.

Code:
 public void start()
 {
     if (slang == null)
     {
         if (getGraphics() != null) {
             slang = new Snake(getGraphics(), 10, Color.GRAY,10,getBackground());
             slang.start();
         }
     }
     requestFocus();
 }

thx

Bavo_acku

Legacy Member
Zulke listeners (ik neem aan dat je op MouseMoveListener doelt) werken op niveau van de hoogste component. Als je over een button beweegt wint hij geen focus + het (her)wint enkel focus bij een mouse-event, wat u niet vooruit helpt als je iets met keyboard hebt gedaan.
Dat werkt dus amper.

Als je daarop doelt.

QplQyer

Legacy Member
Bavo_acku zei:
Zulke listeners (ik neem aan dat je op MouseMoveListener doelt) werken op niveau van de hoogste component. Als je over een button beweegt wint hij geen focus + het (her)wint enkel focus bij een mouse-event, wat u niet vooruit helpt als je iets met keyboard hebt gedaan.
Dat werkt dus amper.

Als je daarop doelt.
Ik had het op een MouseListener en dan via de methode mouseEntered zien of je muis in je programma zit. 't werkt enkel op het hoogste niveau inderdaad, maar bij een gewone gui heb je meestal elementen die de focus ook willen (spinners, knoppen, inputvelden) dus is dat niet echt een probleem, vanaf dat de muis weer uit een component komt krijg je weer de normale inputmogelijkheden.

Het is een beetje een heuristiek, maar hij heeft wel dit probleem helpen overwinnen in één van mijn programma's ...

Als je in een thread constant de focus op je Panel bv opvraagt verlies je constant de focus van je andere componenten en vaak is die focus wel nodig.

De beste oplossing is om gewoon bij elke component de gebruikte actionmap/inputmap te installeren, dan ben je zeker dat je altijd op een knop kan duwen en die knop de juiste functie doet.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan