BufferStrategy flackert (Swing)

Damtonix

Mitglied
Guten Tag alle miteinander,

auch wenn Swing nicht mehr das aktuellste ist, möchte ich trotzdem etwas in Swing programmieren. Dazu verwende ich eine BufferStrategy. Diese hat eigentlich die Aufgabe das Flackern zu verhindern. Das funktioniert auch soweit ganz gut. Doch beim vergrößern oder verkleinern des Fensters(JFrame) flackert es doch ziemlich. Ich würde mich freuen, wenn diese Frage geklärt werden könnte. Danke!

Hier der Code (Dort kann man das Problem sehr gut sehen):

Java:
import java.awt.*;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;

public class Test extends JFrame {
    private static final long serialVersionUID = 1L;
   
    //BufferStrategy
    private BufferStrategy bufferStrategy;
       
    /*
    * Initialisieren
    */
    public void init() {
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setSize(1200, 800);
        super.setLocation((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - 600,(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 - 400);
        super.setTitle("GAME");
        super.setVisible(true);
        super.createBufferStrategy(2);
        bufferStrategy = this.getBufferStrategy();
    }
   
    /*
    * Gibt das Graphics-Object der BufferStrategy mit.
    */
    public Graphics graphics() {
        return bufferStrategy.getDrawGraphics();
    }
   
    /*
    * Neu zeichnen
    */
    public void indicate() {
        bufferStrategy.show();
    }
   
    /*
    * Main-Methode
    */
    public static void main(String[] args) {
        Test test = new Test();
       
        test.init();
       
        while(true) {
           
            Graphics g = test.graphics(); //Graphics von bufferStrategy
           
            g.fillRect(0, 0, 100, 100);
           
            test.indicate(); //Anzeigen
           
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
           
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Bitte immer in Code-Tags posten.
Java:
import java.awt.*;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;

public class Test extends JFrame {
    private static final long serialVersionUID = 1L;

    // BufferStrategy
    private BufferStrategy bufferStrategy;

    /*
     * Initialisieren
     */
    public void init() {
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setSize(1200, 800);
        super.setLocation((int) Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2 - 600,
                (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2 - 400);
        super.setTitle("GAME");
        super.setVisible(true);
        super.createBufferStrategy(2);
        bufferStrategy = this.getBufferStrategy();
    }

    /*
     * Gibt das Graphics-Object der BufferStrategy mit.
     */
    public Graphics graphics() {
        return bufferStrategy.getDrawGraphics();
    }

    /*
     * Neu zeichnen
     */
    public void indicate() {
        bufferStrategy.show();
    }

    /*
     * Main-Methode
     */
    public static void main(String[] args) {
        Test test = new Test();

        test.init();

        while (true) {

            Graphics g = test.graphics(); // Graphics von bufferStrategy

            g.fillRect(0, 0, 100, 100);

            test.indicate(); // Anzeigen

            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}
 
Ich hatte auch so ein ähnliches Problem, weil ich getGraphics() verwendet habe, ich weiß nicht ob man es in dem Fall verwenden sollte aber generell sollte man in der überschriebenen paint() Methode Zeichen.
 
Heißt das ich soll die BufferStrategy weg lassen und einfach in die paint() Methode schreiben? Denn ich kann die Graphics der BufferStrategy zwar auslesen, aber nicht zeichnen. Ich weiß nicht warum.
 
Bei mir war das so das als ich getGraphics () verwendet habe und irgendwas auf das Fenster gezeichnet habe und dann die Fenstergröße geändert habe, wurde die komplette Zeichenfläche gelöscht. Daher kommt wahrscheinlich auch das flackern bei dir wenn du die Fenstergröße veränderst.

Und was meinst du mit "du kannst nicht zeichnen"?
Edit : vielleicht hilft dir dieser Link: https://stackoverflow.com/questions/16264329/bufferstrategy-and-swing-combined
 
Zuletzt bearbeitet:
Das Problem ist, dass immer wen man direkt auf ein JFrame zeichnet, dieses sich beim vergrößern restetet. Das ist auch der Fall, wenn man einfach nur in die paint() Methode schreibt. Das heißt ich musste eine Lösung finden, mit der ich nicht auf dem Frame zeichne. Leider kann man eine BufferStrategy nicht auf ein JPanel zeichnen. Also habe ich ein Canvas genommen und nun funktioniert es.
 

Zurück
Oben