Toon posts:

[J2ME] repaint() probleem bij meerdere klassen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb 3 klassen die extenden van de Canvas klasse en de paint() functie op de volgende manier implementeren:

code:
1
2
3
4
5
6
7
8
9
10
11
Cell extends Canvas{

  private int x;
  private int y;
  private String content;

  //enige paint() die werkelijk iets tekent op het scherm  
  protected void paint(Graphics g){
    g.drawString(content, x, y, g.BASELINE|g.HCENTER)     
  }  
}

code:
1
2
3
4
5
6
7
8
9
10
11
Row extends Canvas{

  private Cell[] cells;
    
  //geeft alleen een referentie-naar-het-scherm door
  protected void paint(Graphics g){
    for(int i=0; i < cells.length; i++){
      cells[i].paint(g);
    }      
  }  
}

code:
1
2
3
4
5
6
7
8
9
10
11
Table extends Canvas{

  private Row[] rows;
  
  //geeft alleen een referentie-naar-het-scherm door
  protected void paint(Graphics g){
    for(int i=0; i < rows.length; i++){
      rows[i].paint(g);
    }        
  }  
}

Als ik een Table Object aanmaak in mijn MIDlet en daarna het Display zet mbv display.setCurrent(eenTabel) wordt er een tabel gepaint, dit werkt perfect. Ook het repainten werkt prima als ik repaint() aanroep op de volgende manier:
eenTabel.repaint();

Echter als ik probeer een 1 specifiek Cell Object te repainten werkt het niet omdat Graphics g in de paint() functie van de Cell klasse waarschijnlijk geen geldige/goede referentie is naar het scherm/screen van het MIDlet want er veranderd dus niets op het scherm (hij repaint iig niet datgene wat zichtbaar is op het scherm). Voorbeeld:
eenTabel.rows[1].cells[1].repaint();

Ik heb al geprobeerd een public Graphics Object in die klasse bij te houden met een referentie naar het Graphics Object uit de Table klasse, dit werkt echter ook niet :'(

Heeft iemand een idee hoe ik het voor elkaar kan krijgen een specifiek Cell Object te repainten in plaats van een heel Table Object te moeten repainten?

Verwijderd

Topicstarter
Ok, ik heb een oplossing voor mijn probleem gevonden. Het is niet de mooiste maar het werkt.

Als ik een Cell object wilt repainten vraag ik de coordinaten, breedte en hoogte op van die cel. Op basis van die gegevens repaint ik dat deel van het scherm waar de Cell staat ipv het hele scherm te repainten.

Ik heb alleen mijn twijfels of het sneller is t.o.v. het repainten van het hele scherm...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat je hier wilt bereiken kan ook niet, je kunt maar 1 Canvas zichtbaar op je scherm hebben. Ik zou Cell en Row dan ook helemaal niet laten overerven van Canvas (maar die paint methode implementeren kan natuurlijk wel ;))

Wat ik overigens niet begrijp is waarom de aanroep uberhaupt lukt :? De paint () methode is protected, en dus kan Table niet bij Row.paint () en Row niet bij Cell.paint (), want het zijn geen subclasses van respectivelijk Row en Cell

En wat snelheid betreft: bedenk dat die mobile devices meestal een retetraag scherm hebben. Een kleiner gedeelte painten is dus altijd sneller dan het hele scherm

[ Voor 16% gewijzigd door .oisyn op 23-04-2003 13:23 ]

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.


Verwijderd

Topicstarter
Wat je zegt is waar. Echter wil ik ook de flexibiliteit om bv een keer alleen een Cell object te gebruiken ipv een Table of Row object. En dan moet die klasse wel een afgeleide zijn van Canvas...

Table kan bij Row.paint() komen omdat ze beiden afgeleiden zijn van Canvas.
Normaal gesproken kan het idd niet. Maar omdat ze nu beiden dezelfde functie uit de superklasse overiden kan het dus wel. (geloof ik :) )

Ik heb de beschikking over een aantal devices (mobiele telefoons en palm) en tot nu toe valt de traagheid me alles mee.

Uiteraard wil ik de applicatie zo snel mogelijk maken, vandaar ook mijn zoektocht naar een manier om per Cell te kunnen repainten ipv alle cellen als dat niet nodig is.

[ Voor 44% gewijzigd door Verwijderd op 23-04-2003 16:23 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 23 april 2003 @ 16:17:
Table kan bij Row.paint() komen omdat ze beiden afgeleiden zijn van Canvas.
Normaal gesproken kan het idd niet. Maar omdat ze nu beiden dezelfde functie uit de superklasse overiden kan het dus wel. (geloof ik :) )
heb het even nagezocht, en ik zat er idd naast, maar jouw uitleg klopt niet ;)

[q]6.6.2.1 Access to a protected Member
Let C be the class in which a protected member m is declared. Access is permitted only within the body of a subclass S of C. In addition, if Id denotes an instance field or instance method, then:
  • If the access is by a qualified name Q.Id, where Q is an ExpressionName, then the access is permitted if and only if the type of the expression Q is S or a subclass of S.
  • If the access is by a field access expression E.Id, where E is a Primary expression, or by a method invocation expression E.Id(. . .), where E is a Primary expression, then the access is permitted if and only if the type of E is S or a subclass of S.
Je mag dus alleen bij een protected instance member van X als X van hetzelfde type (of een subclass daarvan) is als de class waar je code in staat

Als je dus een class hebt (Canvas) met een protected methode (paint ()), en 2 subclasses daarvan (Cell en Row), dan kan Row alleen paint aanroepen op instanties van Row of subclasses van Row

Alleen waar ik mij in vergiste is dat package access voor gaat. Omdat Cell, Row en Table in dezelfde package staan hebben ze dus ook toegang tot elkaars protected members. En ik dacht nou juist dat een protected eigenlijk net als private was, maar dan met nog extra access voor subclasses. Maar het is dus net als package met nog extra access voor subclasses :)

(Komt omdat ik een C++ man ben, en C++ kent geen package access specifiers :Y))

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.


Verwijderd

Topicstarter
Om maar even wat op te biechten, ik ben ook niet een die-hard Java coder :)
Vandaar dat ik mijn vraag ook graag wilde delen.
Pagina: 1