[java] aanroepen public functie uit parent klasse

Pagina: 1
Acties:

  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Ik zit met het probleem dat de z-order van een canvas niet zomaar aangepast kan worden (een nieuw toegevoegd canvas word boven de oude getekend). De oplossing is om alle canvassen in een vector te plaatsen en de volgorde te veranderen als er op een canvas geklikt word. (Het canvas waarop word geklikt komt boven de andere te liggen). Vanzelfsprekend moeten de canvassen dan worden geremoved van de applet en opnieuw worden toegevoegd in de nieuwe volgorde.

Het exacte probleem waar ik mee zit is als volgt:
de vector bevat 4 instanties van een eigen canvas klasse: Memo. Deze klasse Memo bevat een functie die de vector opnieuw indeeld als er op het betreffende canvas wordt geklikt. Om dan de nieuwe volgorde van canvassen te weergeven moetten ze worden geremoved en opnieuw worden toegevoegd. De functie in de applet is statisch en kan ik aanroepen vanuit de Memo klasse maar ik kan vanuit die statische methode niet met remove(Object) een object van de applet verwijderen omdat deze niet statisch is. Is het mogelijk om dus vanuit die statische methode een niet-statische functie aan te roepen?

(Het lijkt mij niet de mooiste oplossing eigenlijk als ik het zo teruglees, maar een andere de andere kant denk ik dat dit toch mogelijk moet zijn).

[ Voor 17% gewijzigd door oogapp0ltje op 11-12-2004 01:22 ]

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
foutje

[ Voor 97% gewijzigd door oogapp0ltje op 11-12-2004 01:00 ]

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
Ik snap het eerlijkgezegd niet helemaal, kun je wat code laten zien?

  • windancer
  • Registratie: Maart 2000
  • Laatst online: 15:12
Op welke instantie van het object zou de niet-statische methode dan moeten werken ? Het is dus gewoon niet zonder meer mogelijk.

PS Ik kan de vraag uit de titel van het topic niet terugvinden :/
Ravenof schreef op zaterdag 11 december 2004 @ 00:48:
Is het mogelijk om dus vanuit die statische methode een niet-statische functie aan te roepen?

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Canvas is een klasse uit het awt tijdperk, die zou ik proberen te vermijden.

"Beauty is the ultimate defence against complexity." David Gelernter


  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Ik zal mijn vraag proberen duidelijker te omschrijven. De school verplicht mij het Canvas te gebruiken, ik kan hier helaas niet omheen.

Ik licht mijn probleem toe met een voorbeeld, de echte klasse Memo is veel uitgebreider en kan niet gekloond worden als statische variable omdat deze gebruiker-specifieke informatie bevat die interactief gewijzigd kan worden.

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
class Memo extends Canvas { 
    public Memo() {
    }

    public void init() {
        TestApplet.verwijderElementen();
    }

    public void paint(Graphics g) {
    }
}


class TestApplet extends Applet {
    private Memo memo1 = new Memo(),
                 memo2 = new Memo();

    public void paint(Graphics g) {
    }

    public void init() {        
        this.add(memo1);
        this.add(memo2);
    }

    static void verwijderElementen() {
        this.remove(memo1);
        this.remove(memo2);
    }
}


De compiler geeft in bovenstaande situatie de volgende melding:
"non-static method remove(java.awt.Component) cannot be referenced from a static context"

Kort gezegd: de java-compiler kan vanuit deze statische member functie geen non-statische methode of variable benaderen.

Ik zoek een manier zodat ik vanuit de klasse Memo een functie uit TestApplet kan aanroepen waarbij ik in deze functie ook gebruik kan maken van alle methoden van TestApplet. (Bij deze statische methode kan dat blijkbaar niet)

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • Mennootje
  • Registratie: December 2000
  • Laatst online: 11-04 16:30
Enige juiste en werkende oplossing voor je probleem lijkt mij om de instantie van het applet op te slaan in je Memo. Om even je code erbij te pakken:
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
29
30
31
32
33
34
class Memo extends Canvas {

    private TestApplet applet;
    
    public Memo(TestApplet applet) {
        this.applet = applet;
    }

    public void init() {
        applet.verwijderElementen();
    }

    public void paint(Graphics g) {
    }
}


class TestApplet extends Applet {
    private Memo memo1 = new Memo(this),
                 memo2 = new Memo(this);

    public void paint(Graphics g) {
    }

    public void init() {        
        this.add(memo1);
        this.add(memo2);
    }

    public void verwijderElementen() {
        this.remove(memo1);
        this.remove(memo2);
    }
}

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 11:10

odysseus

Debian GNU/Linux Sid

Op dit moment gaat de aanroep van verwijderElementen() wel goed, dat is het probleem niet - het zit in die this.remove()'s. Die werken niet omdat je vanuit een statische context probeert iets te verwijderen dat bij een instantie hoort en dat is niet mogelijk: er is immers een onbeperkt aantal instanties en de statische methode heeft geen enkele manier om uit te vinden welke instanties er zijn en hoe die aan te roepen zijn. Een oplossing zou zijn om memo1 en memo2 statisch te maken, maar dat kan waarschijnlijk niet zomaar - ik neem aan dat elke TestApplet zijn eigen Memo's nodig heeft.

Er zijn wel lelijke oplossingen te verzinnen. Zo zou je in plaats van een 'private Memo' een 'private static List<Memo>' kunnen gebruiken. Je kunt immers vanuit een niet-statische context wel de statische context bereiken (daar is er maar een van, dus die is altijd terug te vinden) en dus zou je in de init() van TestApplet steeds een nieuwe Memo kunnen toevoegen aan die statische array. Vervolgens moet je wel de index van dat ding in de instantie zelf opslaan, anders kan je hem niet meer terugvinden. Je hoort mij niet zeggen dat het mooi is, maar het compileert :). Het is me niet helemaal duidelijk wat je nu precies wilt bereiken, maar waarschijnlijk kan je de code wel op zo'n manier opzetten dat je dit probleem niet tegenkomt - het is nogal een ontwerpprobleem en het is vast niet de bedoeling dat je daaromheen gaat programmeren :).

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.

Pagina: 1