[JAVA] Géén paint na deactivated applet?

Pagina: 1
Acties:

  • Victorio
  • Registratie: Januari 2001
  • Laatst online: 01-02-2024
Ik weet niet precies of dit het geval is:

windowDeactivated (WindowEvent e) {}
en dan die 6 anderen... :)

Mijn applet tekent een figuur, dat duurt een paar seconden, en het is vrij irritant dat als je even een ander (browser) window over het window waarin de applet staat klikt, en dan weer terug, de paint opnieuw aangeroepen wordt.

Wat ik probeer te bereiken is dus dat als de applet wordt overlapt door een ander window, en daarna weer tevoorschijnkomt, er niet opnieuw paint wordt aangeroepen.

Zat te denken: Dan zet ik toch gewoon niets in paint en roep ik de belangrijke shit in init aan? Maar dat kan niet want ik gebruik wel repaint in de applet voor de interactie.

Moet ik voor dit probleem die WindowListener gebruiken? Heb er naar gezcht maar zou verder niet weten hoe. :s

  • NDF82
  • Registratie: Januari 2002
  • Laatst online: 13-08 17:12

NDF82

Doomed Space Marine

Dan moet je het dubbel bufferen. Je tekent je shit wat schijnbaar vrij lang duurt op een apart Graphics object, pakt daar het Image object van en in de paint teken je die Image. Dan hoef je je zware berekening (waarom duurt het anders zo lang :? ) maar 1 keer te doen.

Pentium 233MHz MMX + Diamond Monster 3D 3DFX Voodoo II


  • Victorio
  • Registratie: Januari 2001
  • Laatst online: 01-02-2024
Hmmmm ok. Maar bedoel je dan een paintNep() ofzo? Want je hebt toch de Graphics van paint nodig om uberhaupt iets te kunnen tekenen. En dan moet je die 2e methode aanroepen met paint, dan komt je op hetzelfde uit.

  • NDF82
  • Registratie: Januari 2002
  • Laatst online: 13-08 17:12

NDF82

Doomed Space Marine

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
//globals
BufferedImage bImage;
...

public void init() {
    ...
    bImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB );

    ...

    computeBackground(bImage);
}

public void paint(Graphics g) {
    g.drawImage(bImage, 0, 0, this);

    // en hier de rest tekenen
}

public void computeBackGround(Image i) {
    Graphics g = i.getGraphics();

    //vul maar in
    ...
}


edit:
ow ja, kwas mis, dit is niet dubbel bufferen

[ Voor 7% gewijzigd door NDF82 op 23-01-2003 09:27 ]

Pentium 233MHz MMX + Diamond Monster 3D 3DFX Voodoo II


  • Victorio
  • Registratie: Januari 2001
  • Laatst online: 01-02-2024
Maar ik heb niet met een image te maken, of moet dat juist gebeuren? Ik teken meer het scherm vol met troep, zoals dit bijvoorbeeld:

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
import java.awt.Graphics;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;

public class Test extends Applet {

    int blok = (int)(1+(Math.random()*5));
    
    private void kleurBlok(Graphics gr, int x, int y)
    {
        int r = (int)(10+(Math.random()*240));
        int g = (int)(10+(Math.random()*240));
        int b = (int)(10+(Math.random()*240));
        
        gr.setColor(new Color(r,g,b));
        gr.fillRect(x, y, x+blok, y+blok);
    }
    
    public void paint(Graphics g)
    {
        int width = 500;
        int height = 400;
        int aantal = (width/blok)*(height/blok);
        int y = 0;
        
        while (y<height)
        {   
            int n = 0;
            
            while (n<width)
            {
                this.kleurBlok(g, n, y);
                n = n+blok;
            }
            
            y = y+blok;
        }
        
        g.setColor(Color.white);
        g.setFont(new Font("SansSerif", 1, 50));
        g.drawString("JAVA ROELEERT!",30,180);
        g.setFont(new Font("SansSerif", 1, 20));
        g.drawString("Het aantal gekleurde vierkantjes is:",75,225);
        g.drawString(aantal+" stuks!",190,264);
    }
}


Hoe post je als java code?

[ Voor 9% gewijzigd door Victorio op 23-01-2003 09:32 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:28

Janoz

Moderator Devschuur®

!litemod

Victorio, kijk eens ff goed naar de code die je wordt aangeboden. Wat is nu het verschil tussen het tekenen op je canvas (met de graphics die je met paint meekrijgt) of het tekenen op een (buffered)image die je in de paint methode in een keer op je canvas propt?

(Door [code=java] te gebruiken ipv [code])

[ Voor 9% gewijzigd door Janoz op 23-01-2003 09:35 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Victorio
  • Registratie: Januari 2001
  • Laatst online: 01-02-2024
Ah ok. Ja zo ver ben ik nog niet in m'n java cursus. :/
Maar als het dus niet via een windowlistener kan (dacht ik weer eens logisch na te denken...) zal ik eens dat BufferedImage hoofdstuk doorlezen. Hoop dat het zo lukt!
Thnx! :)
Janoz schreef op 23 januari 2003 @ 09:35:
(Door [code=java] te gebruiken ipv [code])
Ok thnx!

[ Voor 27% gewijzigd door Victorio op 23-01-2003 09:39 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:28

Janoz

Moderator Devschuur®

!litemod

In principe is het heel makkelijk. Alles wat je nu in je paint hebt staan moet je zetten in de computeBackGround() (ikzelf zou de methode anders genoemd hebben, paintBackBuffer oid, maar soit). Wat je normaal met die Graphics parameter van paint zou doen doe je nu met de Graphics die je uit het bufferedImage haalt (zie eerste regel van de computeBackGround() methode). Op deze manier teken je alles op die image.

In de paint wordt vervolgens alles op je applet gecopieerd mbv de drawImage(..). In principe hoeft er verder in je paint niks bij. Voor de rest moet je overal waar op dit moment een verandering van het uiterlijk staat de redraw vooraf laten gaan door een computeBackGround.

Wat je zelf in je startpost voorstelde kan eigenlijk niet. Waneer er een ander window over je eigen windo gaat is er dus een deel van je window weg. Het is niet zo dat je OS maar onthoud wat daar stond, daar ben je als programmeur zelf verantwoordelijk voor. Het os roept gewoon de repaint/paint methode aan. Door de bovengenoemde code te gebruiken onthoud je zelf wat er op je canvas stond :)...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1