[java] key events werken niet

Pagina: 1
Acties:

  • MagicTempest
  • Registratie: Maart 2001
  • Laatst online: 19:42
Voor een soort doolhofspelletje wil ik dat hij kan reageren op de pijltjestoetsen, Ik heb alle code volgens mijn leraren gewoon goed maar toch reageert hij niet. weten julie wat er mis is?

Het is btw geen schoolopdracht, maar ik heb wel op school om hulp gevraagd omdat ik het niet meer snapte.

hier stukjes uit me code:

me init:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 public void init ()
  {
    addKeyListener ( new ToetsenHandler () );


    setLayout ( null ); // handmatige layout kiezen

    omhoog = new Button ( "omhoog" ); //knoppen maken
    omhoog.addActionListener( new KnopHandler () );
    omhoog.setBounds ( 350, 270, 40, 20 );
    omlaag = new Button ( "omlaag" );
    omlaag.addActionListener( new KnopHandler () );
    omlaag.setBounds ( 350, 290, 40, 20 );
    rechts = new Button ( "rechts" );
    rechts.addActionListener ( new KnopHandler () );
    rechts.setBounds (390, 290, 40, 20 );
    links = new Button ( "links" );
    links.addActionListener ( new KnopHandler () );
    links.setBounds ( 310, 290, 40, 20 );

    add ( omhoog ); //knoppen toevoegen
    add ( omlaag );
    add ( rechts );
    add ( links );
    requestFocus ();
  }


en de keyhandler:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class ToetsenHandler extends KeyAdapter implements KeyListener
  {
    public void keyPressed ( KeyEvent e )
    {
      int keyCode = e.getKeyCode ();
      switch ( keyCode )
      {
        case KeyEvent.VK_UP:
          up = 1;
          down = 0;
          right = 0;
          left = 0;
          break;
        case KeyEvent.VK_DOWN:
          up = 0;
          down = 1;
          right = 0;
          left = 0;
          break;
        case KeyEvent.VK_RIGHT:
          up = 0;
          down = 0;
          right = 1;
          left = 0;
          break;
        case KeyEvent.VK_LEFT:
          up = 0;
          down = 0;
          right = 0;
          left = 1;
          break;
      }
      repaint ();
    }
  }


als je de hele .java file wilt downloaden kan je dat hier doen:

http://213.10.180.53/doolhof.java


de variabelen up, down, left en right staan helemaal bovenin gedefinieerd. De code is een beetje onoverzichtelijk, sorry voor dat.

Life is like spaghetti. It's hard until you make it. - Tommy Cash -


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

"poor mans debugging" doe eens een echo als er een keypress komt? (en daarna een echo in de betreffende secties?"

Doet iets met Cloud (MS/IBM)


  • MagicTempest
  • Registratie: Maart 2001
  • Laatst online: 19:42
ok, dan mag ik je eerlijk bekennen dat ik niet echt weet hoe je dat doet.

Life is like spaghetti. It's hard until you make it. - Tommy Cash -


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

ik ben geen Java expert
maar als het goed is is er een event KeyPress oid? zoek daar eens op

Doet iets met Cloud (MS/IBM)


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

D2k schreef op 22 oktober 2002 @ 15:59:
"poor mans debugging" doe eens een echo als er een keypress komt? (en daarna een echo in de betreffende secties?"
Das ook mijn aanpak :P

Het is trouwens niet nodig om die KeyHandler de KeyAdapter en de KeyListener te laten implementeren. Die KeyAdapter is een class die zelf ook die KeyListener implementeerd en overal een default (lees leeg) methode bij maakt. Hierdoor hoef je alleen de methodes waar jij in bent geinteresseerd te overriden.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

MagicTempest schreef op 22 oktober 2002 @ 16:01:
ok, dan mag ik je eerlijk bekennen dat ik niet echt weet hoe je dat doet.
zoek keyPressed methode ff op:

public void keyPressed ( KeyEvent e ){
...System.out.println("joehoe ik ben ingedrukt!!");
...int keyCode = e.getKeyCode ();
...
}

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

ik was al bang om afgeschoten te worden met een of de andere methodiek ;)
Het is trouwens niet nodig om die KeyHandler de KeyAdapter en de KeyListener te laten implementeren. Die KeyAdapter is een class die zelf ook die KeyListener implementeerd en overal een default (lees leeg) methode bij maakt. Hierdoor hoef je alleen de methodes waar jij in bent geinteresseerd te overriden.

kijk daar haak ik af ;)
* D2k != Java expert :)

Doet iets met Cloud (MS/IBM)


  • MagicTempest
  • Registratie: Maart 2001
  • Laatst online: 19:42
ik snap al wat jullie bedoelen, ik zat eerst in een hele andere richting te denken, maar gewoon even kijken of er uberhaupt wel op me toetsen gereageerd wordt?

Life is like spaghetti. It's hard until you make it. - Tommy Cash -


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

MagicTempest schreef op 22 oktober 2002 @ 16:10:
ik snap al wat jullie bedoelen, ik zat eerst in een hele andere richting te denken, maar gewoon even kijken of er uberhaupt wel op me toetsen gereageerd wordt?
Precies. Probeer je probleem-gebied tot een minimum te verkleinen en kijk eerst wat er wel werkt :)

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

Alarmnummer schreef op 22 oktober 2002 @ 16:11:
[...]

Precies. Probeer je probleem gebied tot een minimum te verkleinen en kijk eerst wat er wel werkt :)

debuggen noemen ze dat

maakt een groot deel uit van programmeren :)

"het werkt niet" is te vaag
je moet het deel dat niet werkt localiseren en dan kan je het pas oplossen

Doet iets met Cloud (MS/IBM)


  • MagicTempest
  • Registratie: Maart 2001
  • Laatst online: 19:42
ik heb het geprobeerd, ik heb effe snel een ander programmatje geschreven waarin een rondje moest verspringen als je op de toetsen drukte, ook heb ik er 1 geschreven waarbij er tekst op het scherm kwam wanneer je iets intypte, maar bij geen van beide gebeurde er iets.

Als ik een voorbeeld uit mijn boek neem dan werkt de .class daarvan wel met de htm file ( van cd rom af) maar als ik die code in jbuilder 6 neergooi dan krijg ik een internal decoder error.

Life is like spaghetti. It's hard until you make it. - Tommy Cash -


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

klik eens op je window (dus niet op een van de knopjes) en probeer het dan nog eens?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

GEwoon bijna overal een System.out.println() tussen stoppen, vind je vanzelf het probleem :)

If you are not wiping out you are nog pushing enough...


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik snap eerlijk gezegd niet helemaal wat die knoppen verder doen :) Ik neem aan dat daar ook code achter zit waar je mee kan sturen. Verder is het wel erg eigenaardig om voor alle knoppen dezelfde Handler te gebruiken die alleen kan varieren in de event source. Ik hoop niet dat je daar Strings loopt uit te lezen:

public void actionPerformed(ActionEvent ae){
...Button button = (Button)ae.getSource();
...if(button.getText().equals("omhoog")){
...
...}else if...
}

Zo moet je het dus niet doen :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

Alarmnummer schreef op 22 oktober 2002 @ 17:17:
public void actionPerformed(ActionEvent ae){
...Button button = (Button)ae.getSource();
...if(button.getText().equals("omhoog")){
...
...}else if...
}

Zo moet je het dus niet doen :)


Das ook wel heel erg idioot imho... maak er dan dit van:
Java:
1
2
3
4
5
6
7
8
9
public void actionPerformed (ActionEvent ae)
{
    Button button = (Button)ae.getSource ();
    if (button == omhoog)
    {

    }
    else if...
}


let wel: ik zeg niet dat dit wel een goede methode is, maar hij is iig niet zo ranzig als gewoon strings gaan comparen ;)

wat code je trouwens ranzig... of is dat gewoon snel geklopte GoT code? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

.oisyn schreef op 22 oktober 2002 @ 17:23:
wat code je trouwens ranzig... of is dat gewoon snel geklopte GoT code? :)
Zo lang alle code te veel enters krijgt (zit onder linux) weiger ik code tags te gebruiken :P

En ik zou persoonlijk zoiets doen:

public class Richting{
...public static final Richting UP = new Riching(0,1);
...public static final Richting LEFT = new Richting(1,0);
...etc

...private int _x,_y;
...private Richting(int x, int y){
......_x=x;_y=y;
...}
...getters
}

En dan het volgende:

omhoog = new Button();
omhoog.addActionListener(new ButtonHandler(Richting.UP));

etc

  • MagicTempest
  • Registratie: Maart 2001
  • Laatst online: 19:42
de code die ik gebruikt heb voor die knoppen is dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
class KnopHandler implements ActionListener
  {
    public void actionPerformed ( ActionEvent e )
    {
      if ( e.getSource () == omhoog ) { up = 1; down = 0; right = 0; left = 0;}
      repaint ();
      if ( e.getSource () == omlaag ) { up = 0; down = 1; right = 0; left = 0;}
      repaint ();
      if ( e.getSource () == rechts ) { up = 0; down = 0; right = 1; left = 0;}
      repaint ();
      if ( e.getSource () == links ) { up = 0; down = 0; right = 0; left = 1;}
      repaint ();
    }


er zullen vast nog wel betere manieren zijn om ermee om te gaan, maar dit was wat er in me op kwam dat moment. De knoppen hebben ook eigenlijk alleen maar de bedoeling om de rest van het programma te testen terwijl de key handling nog niet werkt.

Dat werken met meerdere knoppen in 1 handler te gebruiken is erg makkelijk als alle knoppen een soortgelijke taak hebben, hier hoef je dan geen 4 handlers te maken, maar is 1 afdoende. ( voor mijn niveau, hier zal ook vast wel een betere manier voor zijn, maar ik heb nog geen 2 maanden les in java, niet zoveel ervaring dus nog)

Life is like spaghetti. It's hard until you make it. - Tommy Cash -


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

aha.. ik zie er erg elementair probleem. Je gebruik een ifreeks ipv een if else reeks. Zoals je ziet moet je dus altijd 4 keer checken (alhoewel je misschien na 1 keer al klaar had kunnen zijn) en verder doe je ook 4 repaints, terwijl 1 voldoende is.

ik zou het volgende doen (wat ook nog erg slecht is trouwens):
public void actionPerformed(ActionEvent ae){
...if(ae.getSource() == omlaag){
...
...}else if(ae.getSource() == omhoog){
...
...}else if(ae.getSource() = rechts){
...
...}else{
...
...}

...repaint();
}

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Kun je niet debuggen met de debugger in je IDE? Dat gaat een stuk sneller en handiger dan System.out's

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 29-08 03:21

.oisyn

Moderator Devschuur®

Demotivational Speaker

[nohtml]
Alarmnummer schreef op 22 oktober 2002 @ 17:28:
Zo lang alle code te veel enters krijgt (zit onder linux) weiger ik code tags te gebruiken :P
ik doelde meer op het feit dat het leek of je zo min mogelijk spaties probeerde te gebruiken :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

.oisyn schreef op 22 oktober 2002 @ 18:19:
[nohtml]
[...]


ik doelde meer op het feit dat het leek of je zo min mogelijk spaties probeerde te gebruiken :)
Ik doe inderdaad een paar foute dingen :D oa meerdere declaraties en statements op 1 regel. Ik was gewoon even lui :)

  • MagicTempest
  • Registratie: Maart 2001
  • Laatst online: 19:42
over het algemeen gebruik ik ook if...else, ik weet niet waarom ik dat hier niet heb gedaan, wat ik wel weet is dat die knoppen wel werken en me keyhandling nog steeds niet. Het klikken in mijn venster werkt btw ook niet, dat feit had ik eerder al ondervonden dat je in je venster moet klikken voordat hij op je toetsen reageert. Bedankt voor de snelle antwoorden allemaal hoor, maar we moeten nog even verder zoeken, iemand verder nog enig id waar het aan kan liggen

Life is like spaghetti. It's hard until you make it. - Tommy Cash -

Pagina: 1