Toon posts:

[java] variabelen van klas naar klas overbrengen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen,

Ik zit met een probleem.
Ik wil dat vanuit de eerste klasse van mijn applet een method word opgestart in een thread. Dit lukt threadnaam.methodenaam();

nu staat er in de methode die ik aanroep dat er een variabele (kijkrichting) moet worden gewijzigt. (in de thread dus).

Mijn hele broncode ziet er zo uit:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package packman;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet {
  private Pacman willem;
  private Color blauw;
  private Button start,stop;

  public void init(){
    start = new Button("Start");
    start.addActionListener(new StartKnopHandler());
    stop = new Button("Stop");
    stop.addActionListener(new StopKnopHandler());

    add(start);
    add(stop);
  }

  class StartKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      willem = new Pacman(getGraphics(),Color.blue,true);
      willem.start();
    }
  }

  class StopKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      willem.stoppen();
    }
  }

  class ToetsenbordMan extends KeyAdapter implements KeyListener {
    public void keyPressed( KeyEvent e){
      int toets = e.getKeyCode();
      switch(toets){
        case KeyEvent.VK_DOWN:
          willem.kopDown();
          break;
        case KeyEvent.VK_UP:
          willem.kopUp();
          break;
        case KeyEvent.VK_RIGHT:
          willem.kopRechts();
          break;
        case KeyEvent.VK_LEFT:
          willem.kopLinks();
          break;
        case KeyEvent.VK_PAGE_UP:
          willem.speedUp();
          break;
        case KeyEvent.VK_PAGE_DOWN:
          willem.speedDown();
          break;
      }
   }
  }

  //einde normale applet
}

class Pacman extends Thread {
 Graphics g;
 Color kleur;
 int x_pos, y_pos, snelheid;
 boolean doorgaan;
 public int kijkrichting;


 public Pacman(Graphics g,Color kleur, boolean doorgaan){
   this.g = g;
   this.kleur = kleur;
   this.doorgaan = doorgaan;
 }

 public void stoppen(){
   doorgaan = false;
   }

 public void run(){
   while(doorgaan){
     teken(g, kleur, x_pos);
     slaap(10);
     verplaats(snelheid, kijkrichting,x_pos,y_pos);
   }
 }

public void verplaats(int snelheid, int kijkrichting, int x_pos, int y_pos){
    int aantalStappen = 1+snelheid;
    switch( kijkrichting ){
     case 3://rechts
       if(x_pos < 199-aantalStappen){
         x_pos += aantalStappen;
       }
       break;
     case 4://links
       if(x_pos > 1+aantalStappen){
         x_pos -= aantalStappen;
       }
       break;
    }
    return x_pos;
  }

 private void teken(Graphics g, Color kleur, int x){
   g.setColor(kleur);
   g.drawOval(x,10,100,100);
 }
 public void kopDown(){
   kijkrichting = 1;
 }
 public void kopUp(){
   kijkrichting = 2;
 }
 public void kopRechts(){
   kijkrichting = 3;
 }
 public void kopLinks(){
   kijkrichting = 4;
 }
 public void speedUp(){
   if(snelheid < 10){
     snelheid++;
   }
 }
 public void speedDown(){
   if(snelheid > 0){
     snelheid--;
   }
 }

 void slaap(int millisec){
   try { Thread.sleep( millisec); }
   catch( InterruptedException e){}
 }

}


vanuit de interne klasse ToetsenbordMan roep ik dus een methode aan in de thread willem (class pacman).

Nu wil ik dat deze methode:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 public void kopDown(){
   kijkrichting = 1;
 }
 public void kopUp(){
   kijkrichting = 2;
 }
 public void kopRechts(){
   kijkrichting = 3;
 }
 public void kopLinks(){
   kijkrichting = 4;
 }
 public void speedUp(){
   if(snelheid < 10){
     snelheid++;
   }
 }
 public void speedDown(){
   if(snelheid > 0){
     snelheid--;
   }
 }


de variabelen ook wijzigen. Dit heeft tot nu toe geen effect gehad op de lopende thread. Dat moet dus wel gebeuren. Ik wil dat na het aanroepen van zo'n methode de thread daar op reageert.

Verwijderd

Het lijkt me dat wanneer je de methoden aanroept, het gewenste effect wel wordt bereikt.

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

Alarmnummer

-= Tja =-

Jij hebt op dit moment een aantal problemen:
1) jouw systeem heeft last van race-problemen. Je hebt namelijk meerdere threads op een resource die eventueel op hetzelfde tijdstip met de velden bezig zijn. Er zijn een groot aantal manieren om dit op te lossen, maar de meest eenvoudige is om een Timer van Swing te gebruiken. Hierdoor heb je dus geen last meer van meerdere threads, omdat de swingtimer ook runt op de event dispatching thread. Dit gaat wel problemen opleveren als je jdk<1.2 wilt gebruiken, want deze heeft op zich geen Swing.

2) Je maakt gebruik van integers terwijl je eigelijk een enumeratie bedoelt. Je kan het beter als volgt opzetten:

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

...private int _xSpeed;
...private int_ySpeed;

...private Richting(int xSpeed,int ySpeed){
......_xSpeed = xSpeed;
......_ySpeed = ySpeed;
...}

...int getXSpeed(){return _xSpeed;}
...int getYSpeed(){return _ySpeed;}
}

en nu kun je zeggen:
Pacman.setRichting(Richting.UP);

Het voordeel van deze aanpak is dat meer controle hebt op fouten. In principe zou bij jou dit namelijk ook kunnen doen:
Pacman.setRichting(Pacman.getScore());

ps: eigelijk is dit helemaal geen enumeratie type, omdat ik later die xSpeed en ySpeed velden heb toegevoegd :-)

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

Alarmnummer

-= Tja =-

3) je bent vergeten de keyboard listener aan te sluiten :+

Verwijderd

Topicstarter
Okay ik wil het zeker gaan proberen, maar ik ben nogal een eerste jaars student... (zie puntje 3)

Punt 3 heb ik inmiddels verbeterd en zoals jij al zou verwachten werkt mijn applet nog steeds niet naar behoren.

Hoe ik punt 2 moet implementeren weet ik niet precies. Ik snap wel hoe je het opgeschreven hebt, maar hoe laat ik deze samenwerken met de:
g.drawOval(x_pos,y_pos,10,10);

Ik heb hier mijn JAVA boek ook naast me liggen (en dan is er... java) maar daarin blijft het bij animaties en dus niet interacive animaties zoals ik wil. Ik hoop dat je me nog even kunt helpen, in ieder geval al bedankt.

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

Alarmnummer

-= Tja =-

Verwijderd schreef op 09 oktober 2002 @ 21:12:
Okay ik wil het zeker gaan proberen, maar ik ben nogal een eerste jaars student... (zie puntje 3)
Dit gebeurt de besten ook hoor :)
Punt 3 heb ik inmiddels verbeterd en zoals jij al zou verwachten werkt mijn applet nog steeds niet naar behoren.
Mijn vaste aanpak bij dit soort problemen is te kijken waar je in ieder geval wel komt. Dit kan je oa doen met systems.out.println`s. Plaatst hem eerst op de 1e regel van de : void keyPressed(KeyEvent e) methode. Dan weet je in ieder geval je daar een event binnenkrijgt.
Hoe ik punt 2 moet implementeren weet ik niet precies. Ik snap wel hoe je het opgeschreven hebt, maar hoe laat ik deze samenwerken met de:
g.drawOval(x_pos,y_pos,10,10);
Je kan pacman zijn nieuwe coordinaten als volgt berekenen:
x=x+richting.getXSpeed();
y=y+richting.getYSpeed();

of met een kortere syntax:
x+=richting.getXSpeed()
en de y die mag je zelf bedenken ;)

Verwijderd

Topicstarter
dit is wat ik tot nu heb:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package packman;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet {
  private Pacman willem;
  private Color blauw;
  private Button start,stop;

  public void init(){
    start = new Button("Start");
    start.addActionListener(new StartKnopHandler());
    stop = new Button("Stop");
    stop.addActionListener(new StopKnopHandler());

    addKeyListener(new ToetsenbordMan());
    requestFocus();

    add(start);
    add(stop);
  }

  class StartKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      willem = new Pacman(getGraphics(),true);
      willem.start();
    }
  }

  class StopKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      willem.stoppen();
    }
  }

  class ToetsenbordMan extends KeyAdapter implements KeyListener {
    public void keyPressed( KeyEvent e){
      int toets = e.getKeyCode();
      switch(toets){
        case KeyEvent.VK_DOWN:
          willem.kopDown();
          break;
        case KeyEvent.VK_UP:
          willem.kopUp();
          break;
        case KeyEvent.VK_RIGHT:
          willem.kopRechts();
          break;
        case KeyEvent.VK_LEFT:
          willem.kopLinks();
          break;

      }
   }
  }

  //einde normale applet
}

class Richting{
  public final static Richting UP = new Richting(0,1);
  public final static Richting LEFT = new Richting(-1,0);
  public final static Richting RIGHT = new Richting(1,0);
  public final static Richting DOWN = new Richting(0,-1);

  private int _xSpeed;
  private int _ySpeed;

  private Richting(int xSpeed,int ySpeed){
   _xSpeed = xSpeed;
   _ySpeed = ySpeed;
  }
}

class Pacman extends Thread {
 Graphics g;
 Color kleur;
 int x, y;
 boolean doorgaan;

 public Pacman(Graphics g,boolean doorgaan){
   this.g = g;
   this.doorgaan = doorgaan;
 }

 public void stoppen(){
   doorgaan = false;
   }

 public void run(){
   while(doorgaan){
     teken(g,x,y);
     slaap(10);
     x=x+ Richting.getXSpeed();
     y=y+ Richting.getYSpeed();
   }
 }
 private void teken (Graphics g, int x, int y){
   g.setColor(kleur);
   g.drawRect(x,y,10,10);
 }
 public void kopDown(){
 }
 public void kopUp(){
 }
 public void kopRechts(){
 }
 public void kopLinks(){
 }

 void slaap(int millisec){
   try { Thread.sleep( millisec); }
   catch( InterruptedException e){}
 }

}


alleen hoe vertel ik java dat ik bij de methode Run() in Pacan Richting.getYSpeed() en de x speed bedoel? Hij legt die link niet en geeft als error:
"Applet1.java": Error #: 300 : method getXSpeed() not found in class packman.Richting at line 96, column 19

ik snap dat hij zoekt in packman, maar ik weet ander ook niet hoe ik 't moet plaatsen. Nu ik er eenmaal mee bezig ben ga ik door totdat ik 'm heb... Ik de code boven weet ik dat de methode van de toetsen nog geen acties hebben.

Verwijderd

Topicstarter
- > tussentijdse melding ik ga nu even op hibernate... morgen weer een dag.

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

Alarmnummer

-= Tja =-

Je bent de methode getXSpeed vergeten te implementeren bij Richting :)

Verwijderd

He Willem,

Ik zal er ook naar kijken, misschien lukt het mij. Dan post ik de code wel.

Alex

Verwijderd

Topicstarter
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package packman;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet {
  private Pacman willem;
  private Color blauw;
  private Button start,stop;

  public void init(){
    start = new Button("Start");
    start.addActionListener(new StartKnopHandler());
    stop = new Button("Stop");
    stop.addActionListener(new StopKnopHandler());

    addKeyListener(new ToetsenbordMan());
    requestFocus();

    add(start);
    add(stop);
  }

  class StartKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      willem = new Pacman(getGraphics(),true);
      willem.start();
    }
  }

  class StopKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      willem.stoppen();
    }
  }

  class ToetsenbordMan extends KeyAdapter implements KeyListener {
    public void keyPressed( KeyEvent e){
      int toets = e.getKeyCode();
      switch(toets){
        case KeyEvent.VK_DOWN:
          willem.kopDown();
          break;
        case KeyEvent.VK_UP:
          willem.kopUp();
          break;
        case KeyEvent.VK_RIGHT:
          willem.kopRechts();
          break;
        case KeyEvent.VK_LEFT:
          willem.kopLinks();
          break;

      }
   }
  }

  //einde normale applet
}


class Richting{
  public final  Richting UP = new Richting(0,1);
  public final  Richting LEFT = new Richting(-1,0);
  public final  Richting RIGHT = new Richting(1,0);
  public final  Richting DOWN = new Richting(0,-1);

  private int _xSpeed;
  private int _ySpeed;

  private Richting(int xSpeed,int ySpeed){
   _xSpeed = xSpeed;
   _ySpeed = ySpeed;
  }

  public int getXSpeed(){
    return _xSpeed;
  }
  public int getYSpeed(){
    return _ySpeed;
  }
}



class Pacman extends Thread {
 Graphics g;
 Color kleur;
 int x, y;
 boolean doorgaan;




 public Pacman(Graphics g,boolean doorgaan){
   this.g = g;
   this.doorgaan = doorgaan;
 }

 public void stoppen(){
   doorgaan = false;
   }

 public void run(){
   while(doorgaan){
     teken(g,x,y);
     slaap(10);
     x=x+ Richting.getXSpeed();
     y=y+ Richting.getYSpeed();
   }
 }
 private void teken (Graphics g, int x, int y){
   g.setColor(kleur);
   g.drawRect(x,y,10,10);
 }
 public void setRichting(){//??
//??
 }
 public void kopDown(){
 }
 public void kopUp(){
 }
 public void kopRechts(){
 }
 public void kopLinks(){
 }

 void slaap(int millisec){
   try { Thread.sleep( millisec); }
   catch( InterruptedException e){}
 }

}

nu geeft hij deze fout:
"Applet1.java": Error #: 308 : non-static method getXSpeed() cannot be referenced from a static context at line 109, column 20

en ook voor de getYSpeed().

Wat bedoeld de compiler daarmee en hoe los ik 't op?

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

Alarmnummer

-= Tja =-

Het probleem is dat je een niet statische methode probeerd aan te spreken terwijl je dat object niet hebt gemaakt. Dit klopt wel, want ik ben dus vergeten te constanten static te maken:
public final static Richting UP = new Richting(1,0);

En verder kan je hem dan als volgt aanspreken:

public void move(Richting richting){
x+=richting.getXSpeed();
y+=richting.getYSpeed();
}

en dan aanroepen met:
move(Richting.UP);

En kun je misschien de volgende keer wat minder code posten? Anders worden het van die lange pagina`s :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 31-08 22:34
Tja, compiler-errors moet je toch zelf kunnen oplossen hoor vind ik.

Kijk eens in uw java-boek naar static methods, wat ze zijn, hoe je ze gebruikt ed...

Je roept je method als volgt aan:
code:
1
Richting.GetSpeedX();

Terwijl Richting hier de naam van je class is. Als je op die manier een method aanroept, dan moet die method een static zijn, dit is hier niet het geval.
Als ik me niet vergis kan een static function enkel static members van die class accessen.

Ik denk dat je een Richting object in uw class Pacman zult moeten hebben....

https://fgheysels.github.io/


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

Alarmnummer

-= Tja =-

whoami schreef op 10 oktober 2002 @ 11:48:
Tja, compiler-errors moet je toch zelf kunnen oplossen hoor vind ik.
In het begin zijn statische en niet statische methodes wel verwarrend :)

Het verschil tussen een statische methode en een niet statische methode is dat je voor een statische methode niet een instantie van een object nodig hebt. Vb.

class Persoon{
...private static int s_maxLeeftijd = 0;
...public static int getLeeftijd(){return s_maxLeeftijd;}

...private int _leefiijd;
...public Persoon(int leeftijd){
......if(leeftijd>s_maxLeeftijd)
.........s_maxLeeftijd = leeftijd;
......_leeftijd = leeftijd;
...}

...public int getLeeftijd() {return _leeftijd;}
}

Stel dat ik nu 2 personen aanmaak:
Persoon jan = new Persoon(10);
Persoon kees = new Persoon(20);

Dan kan ik zeggen: jan.getLeeftijd() en dan krijg ik dus 10 terug.

Maar ik kan nu ook zeggen:
Persoon.getMaxLeeftijd() en dan krijg ik dus 20 terug.

Een statische methode of veld, geld dus voor alle instanties van een class en je zou ze kunnen zien als iets wat ze met elkaar delen.

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Richting{
  public final  Richting UP = new Richting(0,1);
  public final  Richting LEFT = new Richting(-1,0);
  public final  Richting RIGHT = new Richting(1,0);
  public final  Richting DOWN = new Richting(0,-1);

  private int _xSpeed;
  private int _ySpeed;

  private Richting(int xSpeed,int ySpeed){
   _xSpeed = xSpeed;
   _ySpeed = ySpeed;
  }

  public int getXSpeed(){
    return _xSpeed;
  }
  public int getYSpeed(){
    return _ySpeed;
  }
}


zoals je ziet heeft de methode Richting(int xSpeed,int ySpeed) als kenmerk Private. In je voorbeel van Persoon (een post hierboven) heb je 'm public gegeven. Ik weet wat het verschil daartussen is. Waarom?
Als ik m nu compile dan verteld mijn compiler me dat hij de methode Richting ziet als private en dat hij 'm niet kan aanroepen. Dus ik maak daar public van en dan geeft hij bij het aanmaken van een nieuwe richting, bv willem_richting = new Richting(0,0); de volgende fout:
java.lang.StackOverflowError
at packman.Richting.<init>(Applet1.java:67)
at packman.Richting.<init>(Applet1.java:67)
-----------------
en deze schiet als maar verder.

Waar kan dat 'm in zitten?

ps Echt bedankt voor jullie hulp, volgens mij duurt het niet lang meer voordat ik dit onder de knie heb. Met JAVA op school hebben we net "zelf klassen maken" gehad en ik heb nu al een aardig voorsprongetje gemaakt. Ik doe overigens Hogere Informatica op de Hogeschool van Amsterdam.

Ik doe hard m'n best om het allemaal te leren, ik begrijp dat mensen zoals http://gathering.tweakers.net/forum/find/poster/18328 gelijk hebben, maar het is natuurlijk mooi dat iemand zoals Alarmnummer net als onderscript UTFM me wil helpen :) (erg cool van je!)

Ik ga nog even verder proberen, als het me plotseling lukt dan post ik 't wel, mocht iemand het antwoord op m'n vraag weten dan hoor ik dat graag.

  • whoami
  • Registratie: December 2000
  • Laatst online: 31-08 22:34
[nohtml]
Verwijderd schreef op 10 oktober 2002 @ 13:04:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Richting{
  public final  Richting UP = new Richting(0,1);
  public final  Richting LEFT = new Richting(-1,0);
  public final  Richting RIGHT = new Richting(1,0);
  public final  Richting DOWN = new Richting(0,-1);

  private int _xSpeed;
  private int _ySpeed;

  private Richting(int xSpeed,int ySpeed){
   _xSpeed = xSpeed;
   _ySpeed = ySpeed;
  }

  public int getXSpeed(){
    return _xSpeed;
  }
  public int getYSpeed(){
    return _ySpeed;
  }
}


Als ik m nu compile dan verteld mijn compiler me dat hij de methode Richting ziet als private en dat hij 'm niet kan aanroepen. Dus ik maak daar public van en dan geeft hij bij het aanmaken van een nieuwe richting, bv willem_richting = new Richting(0,0); de volgende fout:
java.lang.StackOverflowError
at packman.Richting.(Applet1.java:67)
at packman.Richting.(Applet1.java:67)

Waar kan dat 'm in zitten?
Ik weet niet of het daar mee te maken heeft, maar de creatie van instances van een class doe ik toch nooit in m'n class definitie. (Ik vind het zelfs vreemd dat het toegelaten is, om het zo te doen zoals jij schrijft?
IMHO is het beter dat je dat in de constructor doet.
ps Echt bedankt voor jullie hulp, volgens mij duurt het niet lang meer voordat ik dit onder de knie heb. Met JAVA op school hebben we net "zelf klassen maken" gehad en ik heb nu al een aardig voorsprongetje gemaakt. Ik doe overigens Hogere Informatica op de Hogeschool van Amsterdam.

Ik doe hard m'n best om het allemaal te leren, ik begrijp dat mensen zoals http://gathering.tweakers.net/forum/find/poster/18328 gelijk hebben, maar het is natuurlijk mooi dat iemand zoals Alarmnummer net als onderscript UTFM me wil helpen :) (erg cool van je!)
Dat is natuurlijk wel allemaal mooi enzo, en leergierige mensen zijn 8) . Ik (en Alarmnummer ook wel), zien dat je het wilt leren, en wilt begrijpen enzo. Dan zijn mensen natuurlijk wel meer geneigd om iemand te helpen dan bij mensen die gewoon direct een oplossing voor hun probleem willen hebben en de moeite niet willen nemen om die oplossing te begrijpen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik weet wel hoe je een constructor moet maken, ik ga dat even proberen

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

Alarmnummer

-= Tja =-

Wat je vergeten bent is het static keyword.

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

Als er behoefte is aan deze class (dus je spreekt hem ergens aan), dan wordt automatisch UP (en de rest van de richtingen) aangemaakt (dit hoef je zelf dus niet meer te doen). Deze UP kan je aanspreken als volgt: Richting.UP

En verder wil je niet dat er nog meer richtingen worden aangemaakt, dus je maakt de constructor van Richting private. Hierdoor is het onmogelijk om buitenom Richting instanties ervan aan te maken. De enigste instanties die gemaakt kunnen worden zijn dus die UP,DOWN,LEFT etc, en die worden dus in principe in het begin aangemaakt.

Verwijderd

Topicstarter
Jo! het is gelukt om 'm te laten bewegen... het zit 'm in de keybord listener.. Ik heb de actie nu achter een gewone 'scherm'' knop gezet en dan reageert mijn vierkantje wel op "Ga naar rechts..." Ik ga even uitzoeken waarom hij niet wil luisteren naar mijn toetsenbord.

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

Alarmnummer

-= Tja =-

whoami schreef op 10 oktober 2002 @ 13:20:
[nohtml]
Dat is natuurlijk wel allemaal mooi enzo, en leergierige mensen zijn 8) . Ik (en Alarmnummer ook wel), zien dat je het wilt leren, en wilt begrijpen enzo.
ook wel?? *kijkt verontwaardigd* mensen die moeite ervoor doen, die help ik mee (als ik dat kan). ;)
Dan zijn mensen natuurlijk wel meer geneigd om iemand te helpen dan bij mensen die gewoon direct een oplossing voor hun probleem willen hebben en de moeite niet willen nemen om die oplossing te begrijpen.
en daar is de UTFS en RTFM voor.. niet voor mensen die hun best doen.

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

Alarmnummer

-= Tja =-

Verwijderd schreef op 10 oktober 2002 @ 14:20:
Jo! het is gelukt om 'm te laten bewegen... het zit 'm in de keybord listener.. Ik heb de actie nu achter een gewone 'scherm'' knop gezet en dan reageert mijn vierkantje wel op "Ga naar rechts..." Ik ga even uitzoeken waarom hij niet wil luisteren naar mijn toetsenbord.
Maar je hebt wel een enorme bug in je systeem :) Je moet mijn 1e punt nog maar even doorlezen van mijn 1e commentaar. Je kan echt het beste even een swing timer gebruiken, want deze 'werkt' op de event dispatch thread. Hierdoor heb je dus maar een thread in je systeem en kan je dus geen last krijgen van race problemen. Race problemen zijn trouwens naadje (deadlocks trouwens ook), en het is geen eenvoudige klus om een systeem op te zetten die echt correct werkt.

tip voor beginners.
gebruik geen threads! :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 31-08 22:34
[nohtml]
Alarmnummer schreef op 10 oktober 2002 @ 14:16:
Wat je vergeten bent is het static keyword.

class Richting{
...public final static Richting UP = new Richting(0,1);
...etc
}
he bah... statics die in de class worden ge-initialiseerd. Ik vind de manier om statics te initen in .NET dan wel mooier: met een static constructor.
(Of de C++ manier natuurlijk).

De manier waarop het in Java gebeurt vind ik maar onduidelijk. Een static attribute wordt nl. niet per class bijgehouden, en met die notatie heb je die indruk eigenlijk wel.... (Maar dat is imho natuurlijk).
ook wel?? *kijkt verontwaardigd* mensen die moeite ervoor doen, die help ik mee (als ik dat kan). ;)
:?
* whoami snapt de reden van uw verontwaardiging niet....
Wat is er mis met 'ook wel'?
Er scheelt blijkbaar iets met m'n nederlands. Naast arshia is Alarmnummer er nu ook blijkbaar al niet compatible mee. ;)

https://fgheysels.github.io/


Verwijderd

Topicstarter
Okay... dat van timer ga ik straks aan werken... eerst wil ik mijn vierkant kunnen besturen met de toetsen. Maar die addKeyListener( new ToetsenHandler()); lijkt weinig uit te voeren. Ik heb via een String variabel een soort check in gebouwt om te kijken of de JAVA de toetsen behandeld:

stukje code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package packman;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet {
  private Pacman willem;
  private Color blauw;
  private Button start,stop;
  private String kant;

  public void init(){
    start = new Button("Start");
    start.addActionListener(new StartKnopHandler());
    stop = new Button("Stop");
    stop.addActionListener(new StopKnopHandler());

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

    kant = "geen toets";

    add(start);
    add(stop);
  }

  public void paint(Graphics g){
    g.drawString(""+kant,10,70);
  }

  class StartKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      willem = new Pacman(getGraphics(),true);
      willem.start();
    }
  }

  class StopKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      //willem.kopRechts();
      willem.stoppen();
    }
  }

  class ToetsenHandler extends KeyAdapter implements KeyListener {
    public void keyPressed( KeyEvent e){
      int toets = e.getKeyCode();
      kant = "iets";
      repaint();
      switch(toets){
        case KeyEvent.VK_DOWN:
          kant = "neer";
          repaint();
          //willem.kopDown();
          break;
        case KeyEvent.VK_UP:
          kant = "op";
          repaint();
          //willem.kopUp();
          break;
        case KeyEvent.VK_RIGHT:
          kant = "rechts";
          repaint();
          //willem.kopRechts();
          break;
        case KeyEvent.VK_LEFT:
          kant = "links";
          repaint();
          //willem.kopLinks();
          break;

      }
   }
  }

  //einde normale applet
}

note: de rest heb ik niet meegekopiëerd omdat 't anders zo lang wordt.

wie o wie kan mij vertellen waarom hij niet het variabel kant wijzigt? of waarom die uberhaupt niet de keyHandler uitvoerd. Bij een andere applet die ik had gemaakt werkte het namelijk wel. Vandaar dat ik er van uit ging dat deze ook werkte.

Bij de StopKnop handler zie je als comment staan een methode verwijzing om 'm te laten werken. Als ik deze 'uncomment' en de stop() comment, dan werkt 't wel dus de commando's werken nu, alleen de toetsen willen geen commando's geven...

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

Alarmnummer

-= Tja =-

whoami schreef op 10 oktober 2002 @ 14:30:
he bah... statics die in de class worden ge-initialiseerd. Ik vind de manier om statics te initen in .NET dan wel mooier: met een static constructor.
(Of de C++ manier natuurlijk).

De manier waarop het in Java gebeurt vind ik maar onduidelijk. Een static attribute wordt nl. niet per class bijgehouden, en met die notatie heb je die indruk eigenlijk wel.... (Maar dat is imho natuurlijk).
Het is gebruikelijk om het op deze manier te doen, en ik kan eerlijk gezegd ook niet zien wat onduidelijk aan is. Ik denk voornamelijk dat het komt omdat jij het gewoonlijk dus op een andere manier doet.
:?
* whoami snapt de reden van uw verontwaardiging niet....
Wat is er mis met 'ook wel'?
Er scheelt blijkbaar iets met m'n nederlands. Naast arshia is Alarmnummer er nu ook blijkbaar al niet compatible mee. ;)
'ook wel' is niet iets wat je zegt met enthousiasme :) En verder vind ik het altijd wel leuk belgen te horen praten (vooral Jambers is leuk :P ) soms heb je gewoon ondertiteling nodig omdat je het niet kan verstaan (kan je soms bij groningen ook niet hoor), en sommige woorden zijn zo grappig :) manneke :+

  • whoami
  • Registratie: December 2000
  • Laatst online: 31-08 22:34
[nohtml]
Alarmnummer schreef op 10 oktober 2002 @ 14:45:
[...]

Het is gebruikelijk om het op deze manier te doen, en ik kan eerlijk gezegd ook niet zien wat onduidelijk aan is. Ik denk voornamelijk dat het komt omdat jij het gewoonlijk dus op een andere manier doet.
Het heeft mij de indruk dat er bij elk object van die class een nieuwe instance van die static objecten gemaakt worden.
'ook wel' is niet iets wat je zegt met enthousiasme :)
Nee hoor, het hangt natuurlijk allemaal wel een beetje af van de context. In deze zin waarin ik het gebruikt had, kon je het beter interpreteren als:
Alarmnummer ook natuurlijk of Alarmnummer ook wel natuurlijk .... (if you get my drift).
Maar goed, taalnuances zullen er altijd zijn en anders geinterpreteerd worden, maar ik denk dat dit een discussie is die hier beter niet gevoerd wordt. ;)

https://fgheysels.github.io/


Verwijderd

Topicstarter
okay heb het keylisten gebeuren nu in een lege applet gegooit en daain blijkt dat hij allemaal vage errors geeft dus die ga ik even herschrijven.

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

Alarmnummer

-= Tja =-

En kan je geen System.out.println doen?

Dus
public void keyPressed(KeyEvent e){
...System.out.println("pressed!!!!");
...jouw code
}

en verder is het niet nodig te extenden van een keyadapter en dan ook een keylistener te implementeren. Als je gewoonlijk een interface gaat implementeren moet je dus iedere method van die interface implementeren. Maar dit kan soms erg onhandig zijn. Daarom zijn die adapter classes uitgevonden.

interface X{
...void a();
...void b();
}

abstract class XAdapter{
...void a(){}
...void b(){}
}

class Blaat extends XAdapter{
...void a(){..doe iets leuks.}
}

Trouwens Adapter class in het algemeen hebben een veel breedere werking. Je moet ze zien als een verloop stukje om van het een naar het andere te komen.

interface NederlandseLijst{
...int lengte();
...Object haalObject(int positie);
}

interface EngelseLijst{
...int size();
...Object getObject(int index);
}

class NederlandToEngelsteLijstAdapter implements EngelseLijst{
...private NederlandseLijst _lijst;
...NederlandToEngelsteLijstAdapter (NederlandseLijst lijst){_lijst = lijst;}
...int size() {return _lijst.lengte();}
...Object getObject(int index){return _lijst.haalObject(index);}
}

Verwijderd

Als ik jou was zou ik eerst met systems.out.println kijken hoever hij komt.
Wordt de integer toets wel goed gevuld. Anders werkt die switch natuurlijk ook niet.

Verwijderd

Topicstarter
ik heb nu eventjes een nieuwe applet gemaakt:
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
package TestSpace;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet {
  private String kant = "leeg";

  public void init(){
    addKeyListener(new ToetsenHandler() );
    requestFocus();

  }

  public void paint(Graphics g){
    g.drawString(""+kant,10,70);
  }

  class ToetsenHandler extends KeyAdapter implements KeyListener{
    public void keyPressed( KeyEvent e ) {
    System.out.println("pressed!!!!");
      int keyCode = e.getKeyCode();
      switch( keyCode ){
        case KeyEvent.VK_DOWN:
        kant = "beneden";
        break;
      }
      repaint();
    }
  }
//einde applet
}


maar als ik op Compile klikt zegt hij dit:
C:\JBuilder6\jdk1.3.1\bin\javaw -classpath "C:\Documents and Settings\Willem L. Middelkoop\jbproject\TestSpace\classes;C:\JBuilder6\jdk1.3.1\demo\jfc\Java2D\Java2Demo.jar;C:\JBuilder6\jdk1.3.1\jre\lib\i18n.jar;C:\JBuilder6\jdk1.3.1\jre\lib\jaws.jar;C:\JBuilder6\jdk1.3.1\jre\lib\rt.jar;C:\JBuilder6\jdk1.3.1\jre\lib\sunrsasign.jar;C:\JBuilder6\jdk1.3.1\lib\dt.jar;C:\JBuilder6\jdk1.3.1\lib\htmlconverter.jar;C:\JBuilder6\jdk1.3.1\lib\tools.jar;C:\JBuilder6\lib\jbuilder.jar" com.borland.jbuilder.runtime.applet.AppletTestbed 300 300 testspace.Applet1
java.lang.NoClassDefFoundError: testspace/Applet1 (wrong name: TestSpace/Applet1)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:486)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:111)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:248)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:120)
at com.fourthpass.runtimejb.a.a(Unknown Source)
at com.borland.jbuilder.runtime.applet.AppletTestbed.a(Unknown Source)
at com.borland.jbuilder.runtime.applet.AppletTestbed.startApplet(Unknown Source)
at com.borland.jbuilder.runtime.applet.AppletTestbed.main(Unknown Source)


dat eerste stuk is goed, maar vanaf dit: java.lang.NoClassDefFoundError: testspace/Applet1 (wrong name: TestSpace/Applet1)
kleurt hij het netjes rood (dat is niet goed...)

Verwijderd

Topicstarter
er komt dan ook helemaal niets in beeld van een applet

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

Alarmnummer

-= Tja =-

er gaat iets mis met de naamgeving van je directories.

Packages beginnen altijd met een kleine letter (niet verplicht trouwens), en de directories moeten dus exact zo heten als de package.

dus
package com.jph.koekeBakker;
public class KoekeBakker{}

dan moet die java sourcefile hier staan:
source/com/jph/koekeBakker/KoekeBakker.java
dan worden de classfiles ook op die manier weggeschreven:
classes/com/jph/koekeBakker/KoekeBakker.class

Verwijderd

Topicstarter
okay hij doet 't , ik heb 'm nu test123 genoemd, zonder hoofdletters... nu even kijken waarom hij niet werkt bij die andere applet (m'n packman applet).

Verwijderd

Topicstarter
:'( hij werkt niet bij m'n pacman geval, met precies dezelfde code als in test123...

hier beide codes:
PACMAN
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package packman;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet {
  private Pacman willem;
  private Color blauw;
  private Button start,stop;
  private String kant;

  public void init(){
    start = new Button("Start");
    start.addActionListener(new StartKnopHandler());
    stop = new Button("Stop");
    stop.addActionListener(new StopKnopHandler());

    addKeyListener(new Toetsie() );
    requestFocus();

    kant = "geen toets";

    add(start);
    add(stop);
  }

  public void paint(Graphics g){
    g.drawString(""+kant,10,70);
  }

  class StartKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
          System.out.println("klikked!!!!");
      willem = new Pacman(getGraphics(),true);
      willem.start();
    }
  }

  class StopKnopHandler implements ActionListener {
    public void actionPerformed(ActionEvent e){
      //willem.kopRechts();
      willem.stoppen();
    }
  }

    class Toetsie extends KeyAdapter  implements KeyListener{
    public void keyPressed( KeyEvent e ) {
    System.out.println("pressed!!!!");
      int keyCode = e.getKeyCode();
      switch( keyCode ){
        case KeyEvent.VK_DOWN:
        kant = "beneden";
        break;
      }
      repaint();
    }
  }

  //einde normale applet
}


class Richting{
  public final static Richting UP = new Richting(0,1);
  public final static Richting LEFT = new Richting(-1,0);
  public final static Richting RIGHT = new Richting(1,0);
  public final static Richting DOWN = new Richting(0,-1);

  private int _xSpeed;
  private int _ySpeed;

  public Richting(int xSpeed,int ySpeed){
   this._xSpeed = xSpeed;
   this._ySpeed = ySpeed;
  }

  public int getXSpeed(){
    return _xSpeed;
  }
  public int getYSpeed(){
    return _ySpeed;
  }
}



class Pacman extends Thread {
 Graphics g;
 Color kleur;
 int x, y, count;
 boolean doorgaan;
 Richting willem_richting;

 public Pacman(Graphics g, boolean doorgaan){
   this.g = g;
   this.doorgaan = doorgaan;
   willem_richting = new Richting(0,0);
 }

 public void stoppen(){
   doorgaan = false;
   }

 public void run(){
   while(doorgaan){
     teken(g,x,y,Color.black);
     slaap(200);
     teken(g,x,y,Color.white);
     x=x+ willem_richting.getXSpeed();
     y=y+ willem_richting.getYSpeed();
     count++;
   }
 }
 private void teken (Graphics g, int x, int y,Color kleur){
   g.setColor(kleur);
   g.drawRect(x,y,10,10);
   g.drawString(""+count+"richting: "+willem_richting.getXSpeed(),10,40);
 }
 public void setRichting(){
 }
 public void kopDown(){
   willem_richting = willem_richting.DOWN;
 }
 public void kopUp(){
 }
 public void kopRechts(){
   willem_richting = willem_richting.RIGHT;
 }
 public void kopLinks(){
 }

 void slaap(int millisec){
   try { Thread.sleep( millisec); }
   catch( InterruptedException e){}
 }

}

en de test123 applet waar die WEL werkt... :?
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
package test123;


import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet {
  private String kant = "leeg";

  public void init(){
    addKeyListener(new Toetsie() );
    requestFocus();

  }

  public void paint(Graphics g){
    g.drawString(""+kant,10,70);
  }

  class Toetsie extends KeyAdapter  implements KeyListener{
    public void keyPressed( KeyEvent e ) {
    System.out.println("pressed!!!!");
      int keyCode = e.getKeyCode();
      switch( keyCode ){
        case KeyEvent.VK_DOWN:
        kant = "beneden";
        break;
      }
      repaint();
    }
  }
//einde applet
}


heeft iemand hier een verklaring voor?

Verwijderd

Topicstarter
Niemand?

Kan het misschien iets te maken hebben met requestFocus();?

  • whoami
  • Registratie: December 2000
  • Laatst online: 31-08 22:34
Ahum:
Ik krijg niet snel antwoord dus mag ik schoppen?

Wacht minstens 24 uur voor je je topic omhoog schopt. Doe dit dan ook alleen met een zinnige opmerking en dus niet met "Waarom antwoord er nou niemand" nadat je 5 minuten geen antwoord hebt gehad. Sommigen van ons hebben een leven :+
Misschien is het handig om even uw code te debuggen oid?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Dan wacht ik nog even voordat ik mijn topic een schopje geef..

Ik heb geprobeerd de zaak te compilen en iets wijzer te worden, maar dat van het wijzer worden is niet gelukt. Het lijkt voor mij een misterie. Ik heb nu enkele controls verbonden aan stomme knoppen maar ik wil mijn mannetje besturen via het toetsenbord. Is er misschien nog een andere mogelijkheid daarvoor of is addKeyListener de enige optie?

ps ik heb nu ook wel een stuk of 5 keer het hoofdstuk 16.8 Toetsenbord-events doorgelezen. Maar ook daar wordt ik niets wijzer van.

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

Alarmnummer

-= Tja =-

Dan moet je hier even kijken:
http://search.java.sun.com/search/java/advanced.jsp
en je moet hem ook even in je favorites zetten.
Pagina: 1