Toon posts:

[Java] Paint functie 'langzaam', opsplitsen een idee?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi!

Ik heb op het moment een redelijke paint functie geschreven, waarbij even niet moet worden gelet op de methodes die ik hanteer ( ik ben ook maar een beginner ). Ik zal eerst de paintfunctie eens geven:

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
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
public void paint(Graphics g) {
    super.paint(g);
    Point p1 = null;
    if (scaleMeasurer != null) {
        g.setColor(Color.cyan);
        Iterator iter = scaleMeasurer.getPoints();
        while (iter.hasNext()) {
            Point p = (Point)iter.next();
            g.fillOval((int)p.getX()-5, (int)p.getY()-5, 10, 10);
            if (p1 != null) {
                g.drawLine((int)p1.getX(),(int)p1.getY(), (int)p.getX(), (int)p.getY());
                if (layout.menuItemIsSaveScaleEnabled() == false) {
                    layout.menuItemSetSaveScaleItemState(true);
                }
            } else {
                p1 = p;
                layout.menuItemSetSaveScaleItemState(false);
            }
        }
    }
    if (placeCircleAps != null) {
        int scale = (int)layout.returnScale();
        Iterator iterCircle = placeCircleAps.getPoints();
        while (iterCircle.hasNext()) {
            primColor = Color.LIGHT_GRAY;
            alphaColor = new Color(primColor.getRed(), primColor.getGreen(), 
                        primColor.getBlue(), 98);
            g.setColor(alphaColor);               
            Point pCircle = (Point)iterCircle.next();
            g.fillOval((int)pCircle.getX()-((scale * figureSettings.getAttribute
                 ("Circle_width")) / 2), (int)pCircle.getY()-((scale * 
                  figureSettings.getAttribute("Circle_height")) / 2), (scale *
                  figureSettings.getAttribute("Circle_width")), (scale * 
                  figureSettings.getAttribute("Circle_height")));
            g.setColor(Color.BLACK);
            g.drawOval((int)pCircle.getX()-((scale * figureSettings.getAttribute
                  ("Circle_width")) / 2), (int)pCircle.getY()-((scale * 
                  figureSettings.getAttribute("Circle_height")) / 2), (scale * 
                  figureSettings.getAttribute("Circle_width")), (scale * 
                  figureSettings.getAttribute("Circle_height")));
        }
    }
    if (placeEllipseAps != null) {
        int scale = (int)layout.returnScale();
        Iterator iterClickedForEllipse = placeEllipseAps.getClickPoints();
        while (iterClickedForEllipse.hasNext()) {
            pEllipse = (Point)iterClickedForEllipse.next();
            g.setColor(Color.CYAN);
            g.fillOval((int)pEllipse.getX()-2, (int)(pEllipse.getY()-2), 5, 5);
            try { 
                Point mousePosition = placeEllipseAps.getMousePosition();
                g.drawLine((int)pEllipse.getX(), (int)pEllipse.getY(), (int)
                           mousePosition.getX(), (int)mousePosition.getY());
            }
            catch (NullPointerException npe) {
                System.out.println(npe.getMessage());
            }
        }
    }
}


Deze functie tekent op het moment cirkels en als ik ellipsen wil plaatsen maak ik gebruik van 2 punten. Deze paint tekent daarom ook een lijn van punt 1 naar de positie van de muis op dat moment (om de richting van de ellipse te bepalen ( het scherm wordt dus telkens gerefreshed bij beweging )). De ellipsen zelf teken ik overigens nog niet! Dit omdat wanneer ik 10 cirkels heb in een Vector ik deze elke keer dat ik repaint deze teken, dus ook wanneer ik de muis beweeg. Dit maakt de applicatie echter redelijk sloom als je bedenkt dat ik straks misschien meer dan 10 cirkels ga tekenen én ook nog ellipsen.. (en misschien nog wel meer figuren in de toekomst).

Ik zat dus te denken aan het 'opsplitsen' van de tekenfunctie, zodat ik alleen die functie aanroep die op dat moment actief moet zijn. Daarbij wil ik echter wel de rest wat op dat moment niet gerefreshed hoeft te worden op het scherm laten staan...

Ik teken overigens op een JPanel waarop ik eerst een image open voordat ik daarop ga tekenen. Deze image moet ten alle tijden zichtbaar blijven.

Iemand een idee hoe ik dit 'moet gaan / het beste kan' aanpakken?

[ Voor 9% gewijzigd door Verwijderd op 17-11-2003 12:54 ]


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

Alarmnummer

-= Tja =-

Zou je je layout misschien kunnen fixen? Maakt het wel zo fijn om te lezen.

tip:
Bij lange expressies doe ik dit vaak:

code:
1
2
3
4
int blaat = foo{
  1+2+3+4+5+6+7+1+2+3+4+5+6+7,
  1+2+3+4+5+6+7+1+2+3+4+5+6+7,
  1+2+3+4+5+6+7+1+2+3+4+5+6+7};

[ Voor 57% gewijzigd door Alarmnummer op 17-11-2003 12:53 ]


  • Black Hawk
  • Registratie: Oktober 2003
  • Laatst online: 21-05 15:09
Officieel mag je geen veriabelen aanmaken in de paint methode. Dus zou je de berekeningen in een andere methode moeten maken, en dan de paint aanroepen, met de UITkomsten.

Wie nooit tijd heeft, kan er niet mee omgaan.


Verwijderd

Topicstarter
Black Hawk schreef op 17 november 2003 @ 12:55:
Officieel mag je geen veriabelen aanmaken in de paint methode. Dus zou je de berekeningen in een andere methode moeten maken, en dan de paint aanroepen, met de UITkomsten.
Ja ok, maar ik zal die iterator toch moeten doorlopen... en daarbij moet ik straks per ellipse ook nogeens de ellipse draaien, wat waarschijnlijk ook in de paint functie zal moeten gebeuren...

[ Voor 17% gewijzigd door Verwijderd op 17-11-2003 13:18 ]


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Kun je niet gebruik maken van double-buffering? Op die manier hoef je de daadwerkelijke tekening alleen aan te passen als er ook iets mee gebeurd, en is het geval van muisbeweging de boel in no time getekend.

Verwijderd

Topicstarter
SWfreak schreef op 17 november 2003 @ 13:21:
Kun je niet gebruik maken van double-buffering? Op die manier hoef je de daadwerkelijke tekening alleen aan te passen als er ook iets mee gebeurd, en is het geval van muisbeweging de boel in no time getekend.
Hm, ik zal eens op zoek gaan naar doublebuffering..

ik denk dat het een beetje lastig wordt gezien het feit dat ik meedere cirkels en ellipsen teken (runtime)..

[ Voor 14% gewijzigd door Verwijderd op 17-11-2003 14:07 ]

Pagina: 1