[Java] Subclasses vraagje

Pagina: 1
Acties:
  • 338 views sinds 30-01-2008
  • Reageer

  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Als ik in een subclass

schelp = getImage( getDocumentBase(),"shell.JPG" );

Invoer, dan geeft hij een fout, omdat de methode getDocumentBase() niet kan worden gevonden, in de hoofdklasse werkt dit wel.

Als ik deze subclass de applet laat extenden krijg ik in runtime een NullPointer exception....

Kortom: Hoe kan ik shell.JPG vanuit een subklasse in een image laden?

Thnx.

  • tomato
  • Registratie: November 1999
  • Niet online
hoofdklasse.getDocumentBase() :?

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op woensdag 28 november 2001 01:35 schreef tomato het volgende:
hoofdklasse.getDocumentBase() :?
In java is dit (voor zover ik weet) super.getDocumentBase();

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Gokje: je doet dit in de constructor van de klasse die extend van de klasse Applet?

Over het algemeen is het altijd zo dat je methoden in de super klasse gewoon kunt aanroepen vanuit een subklasse (zonder extra toevoegingen als super en dergelijke).

Applet doet echter wat vreemds: je mag pas methoden van de klasse Applet gebruiken (in ieder geval getDocumentBase()) als de init methode van de Applet is aangeroepen.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Ik heb nu schelp = getImage("shell.JPG" ); in een methode binnen de subclass gezet, maar dan krijg in nog steeds een runtime error

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Iets meer code (geen 3 a4-tjes) zou wel makkelijk zijn.

  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Ok, racen is de hoofdklasse, deze roept levels aan, en levels roept weer de class Schelp aan.
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
import java.applet.*;
import java.awt.*;

class Schelp
{
  int[] schelpenX;
  int[] schelpenY;
  int x=50,y=1,zakken=1;
  Image schelp;


  public Schelp(){
    schelpenX=new int[20];
    schelpenY=new int[20];
  }

  void ramdomSchelpen(){
  schelp = racen.getImage( racen.getDocumentBase(),"shell.JPG" );
  }

  void schelpenTekenen( Graphics g ){
  y++;       
  x+=(y*y);

  if ( (80+(zakken*x/65))>480){
    y=1;
    x=50;
    }
  g.setColor(Color.red);
  g.drawString("schelp",300,(80+(zakken*x/65)));
//g.drawImage( schelp, 100, 100,this);
  }

}

Zoals je ziet is de g.drawImage( schelp, 100, 100,this); geremarkt, deze kan ik pas testen als het eerdergenoemde probleem is opgelost.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op woensdag 28 november 2001 11:09 schreef Rempage0611 het volgende:
Ok, racen is de hoofdklasse, deze roept levels aan, en levels roept weer de class Schelp aan.
code:
1
/* snip: meuk */

Zoals je ziet is de g.drawImage( schelp, 100, 100,this); geremarkt, deze kan ik pas testen als het eerdergenoemde probleem is opgelost.
remarken? Nieuw woord? :P

<gokje>

Als je nou eens (naar de tip van mbravenboer) in de constructor Schelp onderaan zet:
[code]super.init ();[/code]
</gokje>

edit: niet goed gelezen

Trouwens is het niet zo handig om je class properties te geven met dezelfde naam als de classnaam. Ik bedoel Image schelp. Noem de class Schelp dan iets van SchelpApplet ofzo.

Bij grotere lappen code gaat het anders erg verwarrend werken.
* drm vindt consequente naamgeving zooo belangrijk

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Kortom: in de constructor van schelp

racen.init(); zetten?

Dat geeft een runtime error

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
1. Schelp extend niet van Applet :?

2. waar komt 'racen' vandaan?

3. waar wordt randomSchelpen aangeroepen?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

mbravenboer:
1. Schelp extend niet van Applet :?
goed punt O-)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Wat is trouwens het nut van een public constructor in een klasse met package access?

  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Ok, ik ben de draad ff een beetje kwijt, dus zal ik de source die ik nu heb, ff hier plakken.

Source 1: De superclass racen
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
import java.applet.*;
import java.awt.*;

/**
 * Dit is het auto, nu fiets-race-spel voor DND.
 *
 * @author R.Hobo M.Leijgraaf
 * @version %I%
 */


public class racen extends Applet implements Runnable
  {

  Level levels;
  Pauze pauze;
  Beginscherm beginscherm;
  Eindscherm eindscherm;
  Button stapje,loop;
  int auto = 0;
  Image buffer,achtergrondImage;
  Graphics bufferG,achtergrondGraphics;
  private Thread thread = null;



  /**
  * Hier worden de buttons gedefinierd, en wordt er nog meer gedaan.
  */
  public void init ()
     {

     levels = new Level();
     pauze = new Pauze();
     beginscherm = new Beginscherm();
     eindscherm = new Eindscherm();
     loop = new Button ( "loop");
     add (loop);
     stapje = new Button ( "1 stapje" );
     add (stapje);
     }

     public void paint ( Graphics g ){
    if( bufferG == null ) // Deze 3 regels code zijn nodig om het een en ander te definieren
      {
      buffer = createImage( 640, 480 ); //maakt een leeg plaatje van 640*480 aan in de buffer
      bufferG = buffer.getGraphics();   //zet he huidige beeld in het de buffer
      }
    levels.besturing();
    levels.teken(bufferG);
    g.drawImage(buffer,0,0,640,480,this);//tekent het plaatje uit de buffer op het scherm

    }

    public void start() {
    if (thread == null) {
    thread = new Thread(this);
    thread.start();
    }
    }

   public void stop() {
    thread.stop();
    thread = null;
   }


    public void run(){
    while (thread!=null){
      pauze.slaap();                 //wacht-mode
      if (levels.klaar){
      repaint();
      levels.klaar=false;
      }
    }
    }

    public void update( Graphics g )
     {
     paint( g ); // Maak de tweede buffer schoon
     }

    public boolean action (Event e, Object o)
     {
     if ( e.target == stapje )
     {
     }
     if ( e.target == loop)
     {
     }
    return false;
    }

 public boolean keyDown (Event e, int key)
    {
    switch ( key )
    {
    case Event.LEFT: levels.fietslinks=true;
    break; // Anders gaat de methode switch() door en doet alleen het rechter pijltje het.. Geloof ik. Het werkt iig wel zo.. Dus.
    case Event.RIGHT: levels.fietsrechts=true;
    }

    return true;
   }

  public boolean keyUp (Event e, int key)
    {
    switch ( key )
    {
    case Event.LEFT: levels.fietslinks=false;
    break; // Anders gaat de methode switch() door en doet alleen het rechter pijltje het.. Geloof ik. Het werkt iig wel zo.. Dus.
    case Event.RIGHT: levels.fietsrechts=false;
    }

    return true;
   }
}

Deze roept dus Level aan, hieronder Level.java
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
import java.applet.*;
import java.awt.*;


class Level
  {
  Omgeving achtergrond;
  Belijning lijnen;
  boolean klaar=false;
  Pauze pauze;
  Fiets fiets;
  Schelp schelp;
  Kuil kuil;
  Paaltje strandpaal;
  int d=1;
  boolean fietslinks=false,fietsrechts=false;


  public Level ()
     {
     achtergrond = new Omgeving();
     lijnen = new Belijning();
     fiets = new Fiets();
     strandpaal = new Paaltje();
     pauze = new Pauze();
     schelp = new Schelp();
     kuil = new Kuil();
     }

  public void besturing(){
    if (fietslinks==true){
    fiets.linksaan();
    }


    if (fietsrechts==true){
    fiets.rechtsaan();
    }

  }

  /**
  * Hier wordt de afbeelding in de buffer getekend en daarna uit de buffer op het beeld getekend.
  */
  public void teken ( Graphics g )
     {
     pauze.slaap();              //wacht-mode
     if (!klaar){
      achtergrond.achtergrond(g);
      lijnen.lijnentekenen(g);          //tekent de zooi in de buffer
      strandpaal.paaltekenen(g);
      schelp.randomSchelpen();
      schelp.schelpenTekenen(g);
      fiets.fietstekenen(g);
      achtergrond.lucht(g);
      //g.drawImage(buffer,0,0,640,480,this);//tekent het plaatje uit de buffer op het scherm
      klaar=true;
     }

   }
}

Hier wordt dus schelp in aangeroepen,zowel randomSchelpen() en schelpenTekenen(g)

Als laatste nu de veranderde code van Schelp.java
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
import java.applet.*;
import java.awt.*;

class Schelp extends Applet
{
  int[] schelpenX;
  int[] schelpenY;
  int x=50,y=1,zakken=1;
  Image schelp;
  racen racen;


  public Schelp(){
    schelpenX=new int[20];
    schelpenY=new int[20];
    racen = new racen();
  }

  void randomSchelpen(){
 // schelp = getImage( racen.getDocumentBase(),"shell.JPG" );
  }

  void schelpenTekenen( Graphics g ){
  y++;                
  x+=(y*y);

  if ( (80+(zakken*x/65))>480){
    y=1;
    x=50;
    }
  g.setColor(Color.red);
  g.drawString("schelp",300,(80+(zakken*x/65)));
//g.drawImage( schelp, 100, 100,this);
  }

}

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je hebt twee Applets: racen (liefst hoofdletters gebruiken voor klassen) en Schelp.

Je maakt zelf een racen aan en vraagt daarna racen om de document-base. Applets zou je allereerst nooit zelf aan moeten maken. Die worden aangemaakt door de browser. Als je hem al zelf aanmaakt kan je er in ieder geval nooit de document-base van aanroepen.

Bekijk eens goed wat je nu als applet wilt hebben en welke klassen je verder wilt gebruiken. Denk niet in termen van "oh ik moet daar die en die functie aan kunnen roepen", maar probeer duidelijk verschillende typen objecten in je probleem te vinden. Elke type wordt een klasse en er is maar 1 applet.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 09:18
mbravenboer schreef op 28 november 2001 @ 13:16:
Je maakt zelf een racen aan en vraagt daarna racen om de document-base. Applets zou je allereerst nooit zelf aan moeten maken. Die worden aangemaakt door de browser. Als je hem al zelf aanmaakt kan je er in ieder geval nooit de document-base van aanroepen.
Maar stel nou dat je een standalone applet hebt (dus niet in een browser), en daarbinnen weer applet en panels enzo.
Dan heb je in je hoofdapplet een init() om het zaakje mee op te starten.
Hoe kun je nou toch de documentBase achterhalen?

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S (Stage 1 tuned)


Verwijderd

FlowDesign schreef op 15 januari 2004 @ 13:10:
[...]


Maar stel nou dat je een standalone applet hebt (dus niet in een browser), en daarbinnen weer applet en panels enzo.
Dan heb je in je hoofdapplet een init() om het zaakje mee op te starten.
Hoe kun je nou toch de documentBase achterhalen?
Dan heb je een appletviewer die de applet aanmaakt. Als je gewoon een progje aan het maken bent dan wil je misschien liever een Frame gebruiken dan een Applet.

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 09:18
jup, je hebt gelijk.
getDocumentBase() werkt idd via een appletviewer in de init()

wat wel vreemd is, is wanneer ik
String codeBase = getDocumentBase().toString();
via een methode doorstuur naar een andere applet en ik in die andere applet deze
string gebruik om een plaatje mee op te halen, het (nog) niet werkt.

De output van getDocumentBase().toString(); is bijv.:
file:/C:/Documents and Settings/Floris/webwinkel/classes/
daar plak ik dan nog "images/default.jpg" zelf ff aan.

Als ik de String zelf ff schrijf (ipv deze op te halen) als:

C:\\Documents and Settings\\Floris\\My Documents\\Fontys_MI\\INT-GPC2\\webwinkel\\classes\\images\\default.jpg

dan krijg ik wel een plaatje te zien.

P.S.
Ik maak gebruik van een Toolkit en van een MediaTracker

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S (Stage 1 tuned)


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
offtopic:
Heb je vandaag zin om Javatopics omhoog te kicken oid?

Ik zie trouwens het nu niet in van het instantieëren van een applet. Pak gewoon een JFrame/JPanel, kortom een JComponent dat hoort bij je gebruik.
Tevens snap ik het nut van de DocumentBase() hier niet. Kun je niet gewoon de rundirectory pakken met File en daar dan je gewenste file neer zetten als relatief pad.

Reden dat het trouwens niet werkt met de documentbase is dat die een StringRepresentatie van een URL geeft en dus file:/ te veel neerzet. Je kunt ook de Toolkit een URL voeren.

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 09:18
Glimi schreef op 15 januari 2004 @ 14:45:
offtopic:
Heb je vandaag zin om Javatopics omhoog te kicken oid?

Ik zie trouwens het nu niet in van het instantieëren van een applet. Pak gewoon een JFrame/JPanel, kortom een JComponent dat hoort bij je gebruik.
Tevens snap ik het nut van de DocumentBase() hier niet. Kun je niet gewoon de rundirectory pakken met File en daar dan je gewenste file neer zetten als relatief pad.

Reden dat het trouwens niet werkt met de documentbase is dat die een StringRepresentatie van een URL geeft en dus file:/ te veel neerzet. Je kunt ook de Toolkit een URL voeren.
offtopic:
Nee, maar beter zo dan nieuwe topics over hetzelfde onderwerp aanmaken hè?


Wat is de snelste manier om file:/ van die String weg te halen?

edit: met String.substring() :)

Als je trouwens geen gebruik maakt van een toolkit,
maar in een applet gewoon doet:

Java:
1
this.getImage(getDocumentBase(), "plaatje.jpg");


dan doet-ie niet moeilijk over het feit dat er file:/ voor staat,
maar 9 v/d 10 keer werkt dat ook niet, Nullpointerexceptions alom

[ Voor 8% gewijzigd door FlowDesign op 15-01-2004 15:04 ]

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S (Stage 1 tuned)


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
FlowDesign schreef op 15 januari 2004 @ 14:54:
offtopic:
Nee, maar beter zo dan nieuwe topics over hetzelfde onderwerp aanmaken hè?
Nou, je context is nogal verschillend, plus dat mensen vaak de eerste paar posts lezen en dan reageren, zodat er twee discussies ontstaan. Vaak is een nieuw topic schoner, maar ach, je hebt gezocht in ieder geval :+
Wat is de snelste manier om file:/ van die String weg te halen?

edit: met String.substring() :)
Dat kan ja, maar ik zou persoonlijk gewoon een URL maken, als je die toch terugkrijgt :)

Zie : http://java.sun.com/j2se/...URL.html#URL(java.net.URL, java.lang.String)
Als je trouwens geen gebruik maakt van een toolkit,
maar in een applet gewoon doet:

Java:
1
this.getImage(getDocumentBase(), "plaatje.jpg");


dan doet-ie niet moeilijk over het feit dat er file:/ voor staat,
De getImage van de Toolkit en degene die jij aanspreekt zijn ook best wel anders qua gebruik. Zie het verschil:
http://java.sun.com/j2se/...tml#getImage(java.net.URL, java.lang.String)
en http://java.sun.com/j2se/...ml#getImage(java.net.URL)

Ik ga er van uit dat de eerste zo gedefinieerd is:
Java:
1
2
3
4
public Image getImage( final URL p_url, final String p_spec ) {

   getImage( new URL( p_url, p_spec) );
}
maar 9 v/d 10 keer werkt dat ook niet, Nullpointerexceptions alom
Nou dat hoort in ieder geval niet, maar ik kan zo 1-2-3 niet zien wat daar de oorzaak van is hier, zo zonder foutmelding, code en achtergrondinformatie.

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 09:18
De reden dat ik met getDocumentBase() aan het werken ben,
is omdat het voor school is.
Dus als een leraar het op zijn eigen PC of een PC op school opstart, dan moet het ook werken ook al heeft hij de classes heel ergens anders staan.

Anders had ik idd wel een statische URL gebruikt want toen werkte het perfect.
Maar helaas...

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S (Stage 1 tuned)


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
:? Nu ben ik je totaal kwijt.
1) getDocumentBase() geeft je een URL terug
2) Die url kun je met de constructor van URL laten appenden. Dat is precies wat de getImage() van Applet doet.
Wat heeft dat met een statische URL te maken?

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 09:18
met statisch bedoel ik, stel dat je het op 1 PC installeert en verder nergens anders,
dan zet je in je code gewoon die URL zelf geschreven neer.
nu moet het dynamisch gebeuren.

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S (Stage 1 tuned)


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Wat is er niet dynamisch dan aan de volgende code?

Java:
1
Toolkit.getImage( new URL( getDocumentBase(), "imgs/plaatje.jpg" ) );

  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 09:18
Glimi schreef op 15 januari 2004 @ 15:29:
Wat is er niet dynamisch dan aan de volgende code?

Java:
1
Toolkit.getImage( new URL( getDocumentBase(), "imgs/plaatje.jpg" ) );
dit werkt in mijn programma misschien ook.
ik heb het nu werkend op deze manier:
(codeBase komt via de init() van de hoofdklasse)

Java:
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
    //Zorgt voor de weergave van de afbeelding van het artikel
    public void laadAfbeelding()
    {
        String tmp = codeBase;
        tmp = tmp.substring(6); //haalt file:/ weg

        String sImage = tmp + "images/"+productNr+".jpg";

        //controleert of het plaatje bestaat
        File f = new File(sImage);
        if (!f.exists()) //als er geen afbeelding is default.jpg laten zien
        {
            sImage = tmp + "images/default.jpg";
        }

        //maak de toolkit om de image op te halen
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        image = toolkit.getImage(sImage);

        //wacht tot de image goed is geladen en ga daarna pas verder
        mediaTracker.addImage(image, 0);

        try{
            mediaTracker.waitForID(0);
        }
        catch (InterruptedException ie){}
    repaint();
    }

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S (Stage 1 tuned)


  • FlowDesign
  • Registratie: Januari 2002
  • Laatst online: 09:18
Als ik het op jouw manier doe krijg ik de volgende error:

java.lang.NullPointerException

at java.applet.Applet.getDocumentBase(Applet.java:95)

at pProductOverzicht.laadAfbeelding(pProductOverzicht.java:413)

op een of andere manier kan (denk ik) java getDocumentBase alleen maar uitvoeren als-ie in de init() staat. Klopt dit?

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S (Stage 1 tuned)

Pagina: 1