Toon posts:

[java] double buffered applet

Pagina: 1
Acties:

Verwijderd

Topicstarter
hoi,

Ik heb de volgende code geschreven:
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
import java.awt.*;
import java.applet.*;
import java.net.*;

public class WebCamApp extends Applet implements Runnable {

    private Image offscreen;
    private URL imageURL;

    public void init () {
      try {
        imageURL = new URL("http://webserver/image.jpg");
        // try to start the thread
        Thread myThread = new Thread(this);
        myThread.start();

        // need an initial image
        offscreen = getImage(imageURL);

      } catch (Exception e) {
        trace("Something went wrong during init");
      }
    }

    public void run() {
      while (true) {
        try {
            Thread.sleep(1000);
            update();
        } catch (InterruptedException e) {
        }
      }
    }

    public void update() {
      offscreen = createImage(320,240);
      Graphics gbuffer = offscreen.getGraphics();

      // now get the image
      Image image = getImage(imageURL);
      gbuffer.drawImage(image, 0, 0, this);
    }

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

    public void trace (String msg) {
      System.out.println(msg);
    }
}

De bedoeling is dat om de seconde het plaatje opnieuw getekend wordt op mijn applet. (Dat plaatje wordt continue veranderd uiteraard).

Ik wil dat graag double buffered doen... Omdat het zonder double buffering de applet erg knippert...

Maar met bovenstaande code veranderd het plaatje niet...

Het is vast heel eenvoudig maar ik zie het ff niet.

Kan iemand me uit de brand helpen hier?

<edit>

Ik zie nu net dat er een NullPointer optreedt die ontstaat in update()

</edit>

  • nxt
  • Registratie: November 2001
  • Laatst online: 26-08 13:51

nxt

Ik weet niet of dit een oplossing is, maar ik zou in
run()

repaint(); aanroepen i.p.v. update();

Verwijderd

Topicstarter
Op zaterdag 09 februari 2002 20:48 schreef nxt het volgende:
Ik weet niet of dit een oplossing is, maar ik zou in
run()

repaint(); aanroepen i.p.v. update();
Je hebt helemaal gelijk.... Ik heb er nu ook dit van gemaakt:
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
import java.awt.*;
import java.applet.*;
import java.net.*;

public class WebCamApp extends Applet implements Runnable {

    private Image offscreen;
    private URL imageURL;

    public void init () {
      try {
        imageURL = new URL("http:webserver/webcam.jpg");

        // need an initial image
        offscreen = getImage(imageURL);

        // try to start the thread
        Thread myThread = new Thread(this);
        myThread.start();


      } catch (Exception e) {
        trace("Something went wrong during init");
      }
    }

    public void run() {
      while (true) {
        try {
            Thread.sleep(1000);
            drawImage();
        } catch (InterruptedException e) {
        }
      }
    }

    public void update(Graphics g) {
      paint(g);
    }

    public void drawImage () {
      offscreen = createImage(320,240);
      offscreen.flush();
      Graphics gbuffer = offscreen.getGraphics();

      // now get the image
      Image image = getImage(imageURL);
      gbuffer.drawImage(image, 0, 0, this);
      repaint();
    }

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

    public void trace (String msg) {
      System.out.println(msg);
    }
}

Maar dan werkt het helaas nog niet...
Ik heb nu geen nullpointers meer... Maar nog steeds het probleem dat de plaatjes niet gerefreshed worden...

  • nxt
  • Registratie: November 2001
  • Laatst online: 26-08 13:51

nxt

misschien dat het aan getImage() ligt,
de api zegt namelijk
This method always returns immediately, whether or not the image exists. When this applet attempts to draw the image on the screen, the data will be loaded. The graphics primitives that draw the image will incrementally paint on the screen.
als je nu eens zoiets probeert om het plaatje te laden:
code:
1
2
3
4
5
offscreen.flush();
offscreen  = getImage(imageURL);
MediaTracker mediaTracker_track = new MediaTracker(this);
mediaTracker_track.addImage(offscreen , 1);
mediaTracker_track.waitForID(1);

Verwijderd

Probeer dit anders eens te veranderen
code:
1
2
3
4
5
6
7
8
9
10
public void drawImage () {
      offscreen = createImage(320,240);
      offscreen.flush();
      Graphics gbuffer = offscreen.getGraphics();

      // now get the image
      Image image = getImage(imageURL);
      gbuffer.drawImage(image, 0, 0, this);
      repaint();
    }

naar dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void drawImage ()
{
    if (offscreen == null) offscreen = createImage(320,240);
    else
    {
      Graphics gbuffer = offscreen.getGraphics();

      // now get the image
      Image image = getImage(imageURL);
      gbuffer.drawImage(image, 0, 0, this);
       // flush graphics object to image and free memory
      gbuffer.dispose();
    }
    repaint();
}

Scheelt ook weer voor de garbage-collector, want die wordt anders een beetje moe van je. Indien je een nullpointer krijgt bij het painten moet je daar even afvangen of offscreen null is. Suc6 verder :)

  • LightYears
  • Registratie: September 2000
  • Laatst online: 14-03-2024

LightYears

wilt geen iPod

Euhm... ik heb ooit zelf es een webcam applet geschreven waaruit bleek dat java een cache gebruikt, je moet de cache omzeilen wil je er voor zorgen dat je applet vervest :)

EAC > Ogg vorbis -q6 > Cowon S9 > Westone ES3X > Oor

Pagina: 1