uepselon: Flimmerfreie Anzeige bei Mehrfachaufruf von paint(Graphics g)

Hallo,

ich bin gerade dabei eine kleine Java Anwendung zu erstellen.
In der Methode paint(...) wird ein Image als Hintergrund gezeichnet und darüber einge kleinere Images.
Die kleinen Bilder können mit der Maus verschoben werden, nun das Problem: Ansich klappt das Verschieben auch ganz gut, nur muss jedesmal die Methode repaint() aufgerufen werden um die Darstellung Aufrecht zu erhalten. Was unweigerlich dazu führt, das die ganze Anwendung zu flackern anfängt wenn mit der Maus ein Bild verschoben wird. Gibt es eine bessere Möglichkeit, sowas zu realisieren?

Hier nochmal mein aktuelles Schema:

public void paint(Graphic g)
{
g.drawImage(Hintergrund...)
g.drawImage(Kleines Bild1, Bild1X, .....)
g.drawImage(Kleines Bild2, Bild2X, .....)
}

public void mouseDragged(MouseEvent e)
{
Bild...X = e.getX();
Bild...Y = e.getY();
repaint();
}

Wie gesagt das ganze flackert einfach zu stark.

Gruß

ueps

  1. Hallo uepselon,

    [..] nur muss jedesmal die Methode repaint() aufgerufen werden um die Darstellung Aufrecht zu erhalten. Was unweigerlich dazu führt, das die ganze Anwendung zu flackern anfängt wenn mit der Maus ein Bild verschoben wird. Gibt es eine bessere Möglichkeit, sowas zu realisieren?

    Die Methode "repaint()" ruft nicht etwa die Methode "paint()" auf, sondern
    die Methode "update()". Und in "update()" passiert grob beschrieben folgendes:

    public void update(Graphics g) {
       g.clearRect(0, 0, width, height);
       paint(g);
    }

    Es wird also zuerst der Zeichenbereich vollständig mit der Hintergrundfarbe
    übermalt und dann erst paint() aufgerufen. Durch das Übermalen mit der
    Hintergrundfarbe entsteht das Flackern. Die Abhilfe besteht ganz einfach
    darin, daß du die Methode "update()" überschreibst und darin nur "paint(g)"
    aufrust. Also etwa so:

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

    Und schon müßte das Flackern verschwunden sein.
    Natürlich mußt du dich dann selbst drum kümmern, falls irgendwelche Teile
    der Zeichenfläche gelöscht werden müssen. Das scheinst du ja aber schon zu
    tun, da du jedesmal den Hintergrund komplett neu zeichnest.

    Gruß
    Slyh

    1. Hi Slyh,

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

      Und schon müßte das Flackern verschwunden sein.

      Danke, dass hat mir sehr weitergeholfen.

      Gruß

      ueps

  2. bevor du repaint aufrufst, zeichne deine 3 images in eine art offscreen image.

    Image showi;
    Graphics showg;

    showi = createImage(30, 30);
    /*mit getSize().width etc lannst du erst arbeiten, wenn die componente dargestellt wurde und die groesse auch bekannt ist.*/
    showg = showi.getGraphics();
    showg.drawImage(Hintergrund...);
    showg.drawImage(Kleines Bild1, Bild1X, .....);
    showg.drawImage(Kleines Bild2, Bild2X, .....);
    repaint();

    public void update(Graphics g) {
      g.drawImage(showi, 0, 0, this);
    }

    damit muss er nur noch ein bild zeichnen und das flakern sollte aufhoeren

    1. Hallo,

      bevor du repaint aufrufst, zeichne deine 3 images in eine art offscreen image.

      damit muss er nur noch ein bild zeichnen und das flakern sollte aufhoeren

      Stimmt, das habe ich bei meiner Antwort noch vergessen zu erwähnen.
      Eine Mischung aus unseren beiden Antworten führt also zur richtigen Lösung. :-)

      Gruß
      Slyh

      1. Hi,

        Stimmt, das habe ich bei meiner Antwort noch vergessen zu erwähnen.
        Eine Mischung aus unseren beiden Antworten führt also zur richtigen Lösung. :-)

        Danke euch beiden, jetzt funktioniert alles prächtig!

        Gruß

        ueps