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...