IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[Swing]setDoubleBuffered: qu'en est-il ?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut [Swing]setDoubleBuffered: qu'en est-il ?
    Bonsoir à tous,

    en lisant la javadoc de la classe JComponent, je suis tombé sur la méthode setDoubleBuffered...

    D'après la description, il semblerait que cette méthode fait tout le travail lié au double-buffering... à quoi cela peut-il bien servir de l'implémenter nous-même ?

    En fait, d'après la FAQ et certaines réponses glanées sur le forum, je croyais qu'il fallait le faire nous-même (utilisation méthode createImage, etc...)

    http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JComponent.html
    Citation Envoyé par Javadoc de la classe JComponent
    setDoubleBuffered
    public void setDoubleBuffered(boolean aFlag)
    Sets whether the this component should use a buffer to paint. If set to true, all the drawing from this component will be done in an offscreen painting buffer. The offscreen painting buffer will the be copied onto the screen. Swings painting system always uses a maximum of one double buffer. If a Component is buffered and one of its ancestor is also buffered, the ancestor buffer will be used.

    Parameters:
    aFlag - if true, set this component to be double buffered

    Alors, qu'en est-il ? Cette méthode suffit-elle à utiliser le DB ? Sinon à quoi sert-elle ?

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Par défaut
    Normalement avec swing aucun besoin de faire le double buffering soi même. Je ne sais pas quel sorte de cas peut conduire à le faire quand même, mais tout est possible.

  3. #3
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par tileffeleauzed
    Je ne sais pas quel sorte de cas peut conduire à le faire quand même, mais tout est possible.
    oui... mais dans la FAQ ( ici) on spécifie bien que "L'affichage par défaut sur un composant awt, swing, ... de Java se fait à l'aide d'un simple buffer"

    Donc d'après toi, le simple fait d'utiliser setDoubleBuffered(true) suffit ?

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Par défaut
    Citation Envoyé par Pill_S
    oui... mais dans la FAQ ( ici) on spécifie bien que "L'affichage par défaut sur un composant awt, swing, ... de Java se fait à l'aide d'un simple buffer"
    Pour swing, c'est faux.
    Citation Envoyé par Pill_S
    Donc d'après toi, le simple fait d'utiliser setDoubleBuffered(true) suffit ?
    Cela ne suffit pas, c'est inutile. Comme les affichages sont bufferisés, cette méthode est surtout là pour permettre de passer en simple buffer (pour des motifs que j'ignore), et donc pour pouvoir faire setDoubleBuffered(false).

    A partir du moment où tu utilises swing, tu n'as rien à faire au sujet des double buffers.

    Là où ces buffers peuvent encore avoir de l'intérêt, c'est pour awt, et peut être pour les affichages mode plein écran, et pour les triples ou quadruples buffers, bref pour les trucs très spécialisés et pointus.

    Par exemple pour toute une fenêtre swing utilise un seul buffer pour tous les composants graphiques. On peut imaginer que dans les cas complexes il y ait besoin d'un buffer par composant. A réfléchir, je n'en sais rien.

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    OK, merci de ces précisions !

    Cela mériterait d'être mentionné dans la FAQ, parce que là je vais pouvoir refaire pas mal de code dans certaines de mes applis (qui utilisaient un double buffering manuel avec des composants swing)


  6. #6
    Membre éprouvé
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Par défaut
    désolé de le dire setDoubleBuffered(true) n'apporte aucune modification
    j'ai testé par moi-meme, d'ailleurs a quoi bon faire du double-buffering software ou hardware en manuelle si une telle fonction existait et était efficace ?
    testes toi meme tu te rendras compte que cette fonction n'apporte aucun changement et que les composants swing comme awt reposent graphiquement sur 1 unique buffer

  7. #7
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Alors, la javadoc est fausse ?

    j'ai quand même un peu de mal à le croire

    La vérité est ailleurs.... mais où ?!


  8. #8
    Membre éprouvé
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Par défaut
    le double-buffering ca sert a quoi ?
    supprimer les problèmes d'affichage lors d'animations qui sont dus à une non-synchronisation avec le rafraichissement de l'écran

    comment on le voit ? tu fais une frame et tu mets une image en mouvement et tu vois que l'image saute sans arret.

    avec le double-buffering software et hardware en manuel, il n'y a plus de probleme, avec la fonction des composants swing, il n'y a aucun changement, donc soit la fonction ne fait rien et meme si elle existe aucun code est derriere (ce que je pense), soit la fonction est mal codée

    personne utilise la fonction de la javadoc, c'est qu'il y a une raison non?

    en espérant en avoir éclairé quelques uns sur ce probleme évidemment assez ambigu

  9. #9
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    bon, d'accord, ça tombe bien, du coup je suis quitte de refaire mon code

    donc soit la fonction ne fait rien et meme si elle existe aucun code est derriere (ce que je pense), soit la fonction est mal codée
    bizarre quand même qu'une méthode aussi vieille que swing n'aie jamais été ni debbuggée ni supprimée....

  10. #10
    Membre éprouvé
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Par défaut
    dans les docs fournies par Sun, setDoubleBuffered(true) est activé par défaut sur les composants swing, hors si tu prends une jframe et que tu déplaces une image assez rapidement dessus avec un thread pour modifier ses coordonnées x (par exemple), tu t'apercois que l'image subit du clipping et par conséquent que setDoubleBuffered(true) ne marche pas

    tu crois que Sun se vente des problemes qu'ils n'ont pas le temps de corriger ? comme la gestion des transparences qui est totalement nulle:

    Transparency.OPAQUE => accéléré en mémoire
    Transparency.BITMASK=> pas d'accélération
    Transparency.TRANSLUCENT=> pas d'accélération non plus

    le probleme du V-Sync (synchronisation de l'affichage du programme en fullscreen mode avec le rafraichissement de l'écran)

    le fait que sur MAC les images gif chargées et affichées aparaissent de couleurs toutes pales 1.0 à 1.4.1_05(now je sais pas avec 1.5)

    les fonctions drawRect(), drawOval(), drawPolygon(), drawArc(), fillRect(), etc ne sont pas accéléré non plus !!!!l
    a fonction drawImage() affichant une image 800*600 de 32ko est beaucoup plus rapide, plus du double voire triple qu'un simple
    setColor(Color.black); drawRect(0, 0, 800, 600);
    et ca c'est inadmissible !

    ces problèmes existent depuis la 1.0 et n'ont toujours pas été réglé, hors beaucoup de programmeurs les rappelle tous les jours sur le forum du site de Sun. Politique commerciale ?
    j'espere avoir fait le tour du probleme 8)

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Par défaut
    Attention que il y a double buffer et double buffer ! (Cela fait 4 )

    A ce que j'ai compris, le double buffer de swing sert simplement à collecter les opérations d'affichage d'un paint, puis, à la fin du paint, les envoyer d'un coup à l'écran.

    Il n'est donc opérationnel que du début à la fin du paints. Donc toutes les opérations qui nécessiteraient un traitement plus fin doivent utiliser autre chose.

    J'imagine que lorsque tu déplaces une image à l'écran, tu dois réaliser un double buffer qui perdure entre plusieurs paint. Ceci peut donc expliquer cela, ce qui permettrait à tout le monde d'avoir raison.

    La FAQ, de mémoire, se place toujours dans le cadre d'un double buffer qui doit dépasser la portée d'un unique paint. Il reste qu'il me semble que de dire que les composants awt et swing ne sont pas double bufferisés est franchement trompeur. Il faudrait au minimum préciser.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/06/2008, 13h58
  2. du Swing dans du SWT est ce possible ?
    Par bitbis dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 13/09/2007, 13h56
  3. [Swing] comment savoir si une fenetre est ouverte ?
    Par uraxyd dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 31/12/2005, 11h55
  4. [swing] quand le jtext field est vide
    Par Samanta dans le forum Débuter
    Réponses: 5
    Dernier message: 05/07/2005, 11h10
  5. [XFORM][SWING] la transformation est elle viable ?
    Par magnus2005 dans le forum Composants
    Réponses: 3
    Dernier message: 10/05/2005, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo