2012-05-21 3 views
1

Le code suivant affiche juste un canevas dans une fenêtre qui vient remplir son contenu avec du rouge. Cependant, lors du redimensionnement de la fenêtre, il scintille beaucoup, car avant chaque repeindre, la toile semble s'effacer. Après un peu de recherche triviale, il semblait être parce que la méthode update() a appelé g.clearRect(), mais j'ai remplacé cela maintenant et le scintillement reste là, la toile s'efface encore avant de repeindre. J'ai joué avec la double mise en mémoire tampon et, pour autant que je sache, cela ne semble pas régler les choses - je ne suis pas sûr de l'utilité que cela aurait de toute façon puisque le problème semble être de prévenir la toile du défrichement avant sa repeinte.Arrêter le canevas Java d'effacer sur repaint

En aparté avant tout le monde se précipite et suggère, je ai utiliser Canvas dans ce cas, pas JPanel, parce qu'à un autre moment, je suis en utilisant le même canevas pour la vidéo natif de jouer avec VLCJ.

public class MyCanvas extends Canvas { 

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

    @Override 
    public void paint(Graphics g) { 
     //By the time we get here, the canvas has been cleared to its background colour 
     g.setColor(Color.RED); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     MyCanvas c = new MyCanvas(); 
     frame.add(c); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

Comment avez-vous implémenté la double mise en mémoire tampon? Je pense que cela ne devrait pas dessiner le rectangle blanc puisque vous avez outrepassé la méthode qui l'a causé ... J'ai essayé le code sur mon ordinateur et ça marche bien. – zeller

+0

@zeller Avez-vous essayé le code tel quel ou sans double tampon? Je viens d'utiliser une approche triviale avec l'échange d'images plutôt que construit dans des stratégies de tampon lorsque je l'ai essayé, mais il n'y avait pas de changement. – berry120

+0

sans double tampon. Il scintille, mais ce n'est pas dû au dessin du rectangle blanc. Je pense que vous devriez essayer la bufferstrategy intégrée, voici un article qui pourrait vous aider: http://stackoverflow.com/questions/5924697/java-double-buffering – zeller

Répondre

2

double buffering, comme prévu, avéré ne pas être la question - de toute façon la toile a été effacée avant de peindre à partir du code qui semblait être profond dans les entrailles de la bibliothèque AWT.

Après avoir retracé à travers les internes pertinentes, il semble que le comportement « clair avant que la peinture » peut être remplacée par une propriété:

System.setProperty("sun.awt.noerasebackground", "true"); 

qui suit arrêté l'arrière-plan d'être effacée sur la toile avant de repeindre, et donc le scintillement associé.

Il convient de noter que cette propriété est évidemment spécifique à la machine virtuelle, donc aucune idée si vous obtenez un comportement similaire ou non sur une autre machine virtuelle. Il fonctionne cependant parfaitement pour mon cas d'utilisation.