2009-12-10 5 views
1

Selon Javadoc, JComponent.repaint(long) est censé planifier un repaint() dans le futur. Lorsque j'essaie de l'utiliser, cela provoque toujours une repeinte immédiate. Qu'est-ce que je fais mal?Pourquoi repeindre (long) repeindre immédiatement?

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Repaint 
{ 
    public static final boolean works = false; 

     private static class CustomComponent extends JPanel 
    { 
    private float alpha = 0; 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setComposite(
     AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); 
     g2d.setPaint(Color.BLACK); 
     g2d.fillRect(0, 0, getWidth(), getHeight()); 
     alpha += 0.1; 
     if (alpha > 1) 
     alpha = 1; 
     System.out.println("alpha=" + alpha); 
     if (!works) 
     repaint(1000); 
    } 
    } 

    public static void main(String[] args) 
    { 
    final JFrame frame = new JFrame(); 
    frame.getContentPane().add(new CustomComponent()); 
    frame.setSize(800, 600); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setVisible(true); 

    if (works) 
    { 
     new Timer(1000, new ActionListener() 
     { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      frame.repaint(); 
     } 
     }).start(); 
    } 
    } 
} 

Répondre

10

Notez que la Javadoc dit la méthode provoquera une repeindre à se produire dans les (et non après) le temps spécifié.

+0

Au moment où cela a été écrit, le JDK de Sun semble ignorer complètement le paramètre "tm". Toutes les implémentations concrètes propagent l'argument à leur conteneur mais personne ne l'utilise jamais. – Gili

1

Le paramètre dit tm - temps maximum en millisecondes mise à jour avant qu'il ne le dit pas ne le fera pas immédiatement aussi les javadocs dire

redessine le composant. Si ce composant est un composant léger, , il en résulte un appel à peindre en l'espace de quelques millisecondes.

+4

JPanel est léger. Les composants lourds sont ceux avec des pairs (AWT Canvas, Panneau, Fenêtre, Cadre, Dialogue, TextField, TextArea, Liste, Case à cocher, etc.). –

+0

Merci pour la clarification que je vais éditer la réponse j'espère que c'est ok –

5

Si vous voulez programmer quelque chose à repeindre, alors vous devriez utiliser une minuterie d'oscillation. Vous ne devriez pas planifier la peinture à partir de la méthode paintComponnt (..). Vous ne pouvez pas contrôler lorsque la méthode paintComponent() est appelée.

+1

L'utilisation d'une minuterie est vraiment la seule façon d'y aller. Si vous essayez de planifier la peinture dans PaintComponent(), vous risquez que le composant ne soit pas repeint immédiatement s'il n'est pas masqué lorsque d'autres composants ou programmes sont déplacés dans un environnement de fenêtrage. – clartaq

1

Si vous recherchez un peu, vous trouvez que ce paramètre est ignoré dans les classes dérivées. ;)

Questions connexes