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

Agents de placement/Fenêtres Java Discussion :

JPanel reste opaque sous Linux ?


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 098
    Par défaut JPanel reste opaque sous Linux ?
    Bonjour à vous tous.
    Je me permets de poster cette question qui me taraude depuis quelques temps. Elle résulte d'un simple constat, lors de l'utilisation d'un splashscreen.
    Récement, j'ai décidé d'ajouter un splashscreen à l'une de mes applications un peu longue a démarrer.
    Jusque là, pas de soucis. Je me documente et remarque qu'en fait, ça fait partie des choses simples.
    Je crée donc un jolie gif animé (trois jours d'illustration, j'aime bien faire les choses moi-même...) clairement dimensionné.
    je le mets en place en guise de Splashscreen, aucuns problèmes. Seulement voilà, j'ai eu envie d'ajouter un JProgressBar, c'est quand même mieux quand on sait où on en est dans notre attente.
    Je comprends alors que mettre en place se composant va se faire en trois étapes.
    La première consiste à récupérer l'objet Graphics du Splashscreen via sa méthode createGraphics() que l'on caste au passage en Graphics2D.
    La seconde consiste à instancier un JProgressBar, de le préparer et de le peindre sur le Graphics2D issu du SplashScreen.
    La troisième se limitant à invoquer le rafraîchissement du SplashScreen par sa méthode update.
    Et là, première surprise. J'ai beau définir un bounds délimitant précisément la position et la dimension de mon JProgressBar par rapport à la réponse getSize() du SplashScreen, cette dernière se loge systématiquement en 0, 0 ?!
    J'en conclu la présence d'une sorte de layout qui m'interdit de positionner les composants où je veux sur mon SplashScreen.
    Je fais peut-être là ma première erreur, mais quoi qu'il en soit, je ne trouves pas d'autre explications, ni de solutions de contournement. Bref, je me dits, pas de problème, au lieu d'insérrer directement mon JProgressBar, je vais insérrer ce dernier dans un JPanel (transparent setOpaque(false)), qui aura la même dimension que le SplashScreen, et je ferai un setLayout(null) sur ce JPanel pour pouvoir positionner et dimensionner celon mes désirs mon JProgressBar.
    Bingo, ça marche....euh, non ?!.
    En fait, ça marche très bien sous Windows. Mais sous Linux, ce dernier se comporte comme si setOpaque(false) sur mon JPanel n'avait absolument aucun effet. Pour preuve, j'ai pu reproduire sous Windows le comportement sous Linux en supprimant le setOpaque(false) ?!.....
    En clair, sous Linux, setOpaque(false) ou setOpaque(true), au niveau du SplashScreen, il s'en fout totalement.
    J'ai alors fait quelques vérifications avec une petite appli qui se contente d'afficher un JFrame contenant un JPanel (setOpaque(false)). Et là, bizarrement, le comportement est identique que ce soit sous Windows ou Linux.
    Je constate donc la chose suivante :
    Mon JPanel, contenu dans un JFrame se comporte de manière identique quelle que soit la plateforme. Mais insérré dans un SplashScreen (géré intégralement par la JVM si j'ai bien tout compris), sa propriété opaque n'est apparament pas prise en compte et le composant reste opaque quelle que soit sa valeur.
    Je ne comprends pas pourquoi.
    Pour arrivé à obtenir ce que je voulais, j'ai fini par faire ainsi :
    J'ai créé une classe étendant JPanel dans laquelle je me suis contenté de ré-écrire la méthode paint(Graphics g) pour 'shunter' cette dernière vers paintChildren(Graphics g) de sorte que le JPanel ne se peigne jamais lui-même. Ca fonctionne, mais je trouve cela rocambolesque, il aurait 'suffit' que la propriété opaque de JPanel soit prise en compte dans le SplashScreen...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    joli texte, mais si tu nous donnais ton code plutot?

    Pour le 0,0ç ca viens du fait que c'est le conteneur qui, avant d'appeler paint() effectue une transformation sur le Graphics pour faire correspondre son 0,0 avec le coin supérieur gauche du composant.

  3. #3
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 098
    Par défaut Pas de problèmes
    Dés que je suis de retour à la maison un peu plus tard dans la soirée, je me connecte et je vous met le code en détail. Merci de votre attention...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  4. #4
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 098
    Par défaut Comme promis, voilà le code a tester
    Voici le code de la fenêtre de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    import java.awt.AlphaComposite;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.SplashScreen;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
     
    public class FrmTestSplash extends javax.swing.JFrame {
     
     
        public FrmTestSplash() {
            super("Fenêtre test");
     
            // Début du code qui ajoute la jauge au SplashScreen...
            SplashScreen splash = SplashScreen.getSplashScreen();
            Graphics2D surfaceSplash = null;
            JProgressBar jauge = null;
            JPanel conteneurJauge = null;
            if (splash != null) {
                surfaceSplash = splash.createGraphics();
                surfaceSplash.setComposite(AlphaComposite.Clear);
                surfaceSplash.setPaintMode();
                }
            if (surfaceSplash != null) {
                conteneurJauge = new JPanel();
                conteneurJauge.setLayout(null);
                conteneurJauge.setOpaque(false);
                conteneurJauge.setBounds(0, 0, splash.getBounds().width, splash.getBounds().height);
                jauge = new JProgressBar();
                jauge.setFont(new Font("Verdana", Font.PLAIN, 9));
                jauge.setMaximum(10);
                jauge.setMinimum(0);
                jauge.setValue(0);
                jauge.setVisible(true);
                jauge.setString("Jauge de test...");
                jauge.setStringPainted(true);
                jauge.setBounds(175, 185, 155, 20);
                conteneurJauge.add(jauge);
                conteneurJauge.validate();
                conteneurJauge.paint(surfaceSplash);
                splash.update();
                // Une petite boucle qui nous laisse dix secondes pour voir le SplashScreen...
                for (int i = 1 ; i <= 10 ; i++) {
                    try {
                        Thread.sleep(1000);
                        }
                    catch (Exception e) {}
                    jauge.setValue(i);
                    if (i == 1) jauge.setString(i + " seconde...");
                    else jauge.setString(i + " secondes...");
                    conteneurJauge.validate();
                    conteneurJauge.paint(surfaceSplash);
                    splash.update();
                    }
                }
            // Fin du code concernant le SplashScreen.
            javax.swing.JButton jButton1 = new javax.swing.JButton();
            jButton1.setText("Quitter");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                    }
                });
            jButton1.setBounds(120, 90, 80, 20);
            java.awt.Container conteneur = getContentPane();
            conteneur.setLayout(null);
            conteneur.add(jButton1);
            pack();
            setSize(320, 200);
            setTitle("Fenetre test");
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            setVisible(true);
            }
     
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            dispose();
            }
     
        public static void main(String args[]) {
            new FrmTestSplash();
            }
    }
    Vous trouverez en pièce jointe, le Gif exemple utilisé par le SplashScreen.
    Pour réaliser le test, il suffit de compiler ce code dans un dossier. Ensuite, d'ajouter le Gif en pièce jointe à ce dossier, puis en ligne de commande, se placer dans ce dossier et taper :

    java -splash:SplashExploit.gif -cp . FrmTestSplash
    Testez l'application résultante sous Windows, puis sous Linux. Chez moi, ça se passe très bien sous Windows, mais sous Linux, dés que je paints le JPanel sur le SplashScreen, malgré le fait d'avoir mis sa propriété opaque à false il reste opaque et masque le Gif...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  5. #5
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Désactive le double-buffering :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    conteneurJauge.setDoubleBuffered(false);
    Sinon tu peux aussi remplacer le JPanel par un JComponent.

    Pour Win, je ne sais pas, je bosse assez peu dans un contexte crosoft !

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    le JPanel ne sert à rien dans l'histoire, travaille directement avec la jauge, en lui passant un graphique adapté, via Graphics.create(x,y,width,height).

    Au delà de ça, pour dessiner un composant non visible, il vaut mieux utiliser print(Graphics). Paint va assumer qu'on est dans le contexte d'un Container graphics, ce qui peux amener des artefacts curieux.

  7. #7
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 098
    Par défaut Bravo et merci.
    Bravo Tchize, je viens de modifier le code celon tes indications. Ca fonctionne parfaitement.
    Le coup du print au lieu du paint, j'avoue que ça ne me serait pas venu à l'idée. Dan mon esprit, de part son nom cette méthode ne concernait que l'impression.
    Cependant, pour ce qui est de l'autre réponse, j'ai regardé et éssayé plusieurs choses, mais je n'ai pas du comprendre. Qu'est-ce que vient faire le doubleBuffering là-dedans ?...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    le doublebuffering, ca consiste à garder un 'image' du composant en mémoire pour aller plus vite. Le problème c'est qu'il est implémenté en swing avec un système de buffer partagé par tout la chaine de composants (sinon la transparence ne serait pas possible) et que donc le buffer est détenu par le coneneur racine (la frame), conteneur racine qui n'existe pas ici, ce qui peux amener dans certains cas le panel à laisser tomber la transparence. De toutes façons, en règle général, on appelle jamais paint sois même, c'est l'EDT qui le fait. Pour demander à un composant de se dessiner hors écran, c'est print qui sert

  9. #9
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 098
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 098
    Par défaut
    Très bien, merci. En plus, j'ai tout compris. On en apprend tous les jours...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

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

Discussions similaires

  1. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 11h43
  2. Comment désinstaller MySQL sous linux
    Par nahmsath dans le forum Installation
    Réponses: 5
    Dernier message: 18/09/2007, 11h46
  3. installer jbuilder7 sous linux
    Par rtlinfo34 dans le forum JBuilder
    Réponses: 5
    Dernier message: 30/10/2002, 20h16
  4. Réponses: 2
    Dernier message: 25/10/2002, 23h19
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 16h57

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