[Java] Comment faire un splash screen ?

Comment faire un splash screen ? [Java] - Java - Programmation

Marsh Posté le 26-04-2004 à 15:05:25    

Je cherche à faire un spash screen pour une appli Java, mais je comprend pas comment faire pour que la fenêtre soit non recouvrable.
Je suis parti avec une JWindow après avoir tenté avec une JFrame et une JDialog. C'est pas mal, c'est pas redimensionnable, pas de boutons, pas de barre de titre, etc... par contre une autre fenêtre peut recouvrir celle ci (une autre application entre autre), et ça ça me va pas. Je trouve pas vraiment d'option pour la faire non recouvrable comme un vrai splash.
 
Comment faire ? :jap:

Reply

Marsh Posté le 26-04-2004 à 15:05:25   

Reply

Marsh Posté le 26-04-2004 à 15:06:35    

tant mieux :o

Reply

Marsh Posté le 26-04-2004 à 15:06:46    

Titalium a écrit :


je comprend pas comment faire pour que la fenêtre soit non recouvrable.


 
Si tu peux ne pas trouver, ça m'arrangerais, merci :jap:


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-04-2004 à 15:09:37    

Plait-il ? C'est quoi le problème là ? :/

Reply

Marsh Posté le 26-04-2004 à 15:11:26    

Bah, ce genre de splashscreen est pénible [:spamafote]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-04-2004 à 15:23:18    

OK, je veux bien concevoir que ce genre de splash c'est pénible. Mais là j'ai pas le choix, je m'explique :
 
Mon responsable veut que je fasse une application qui se lance au boot des postes des employés de ma boite, et qui présente pendant 15 secondes les objectifs fixés par la direction. Il faut donc que la fenêtre ne soit pas fermable ni recouvrable. J'y peux rien, c'est un des points les plus importants du cahier des charges de l'appli, c'est pas moi qui choisi.
Pour l'instant ma fenêtre n'est pas fermable grace à JWindow, mais elle est toujours recouvrable, d'où mon problème... Je cherche pas à faire des applications super chiantes, mais seulement à respecter les impératifs qu'on me fixe. Essayez de me comprendre quoi :sweat: ;)

Reply

Marsh Posté le 26-04-2004 à 15:25:09    

Putain, les méthodes de manageement de merde. Je te le hackerais pour afficher l'image de goatse.cx sur tous les postes :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-04-2004 à 15:28:22    

kadreg a écrit :

Putain, les méthodes de manageement de merde. Je te le hackerais pour afficher l'image de goatse.cx sur tous les postes :o


 
Certes mais c'est pas moi qui choisi, je le répète, moi je veux juste faire ce qu'on me demande. Je suis parfaitement conscient que les employés vont raler, mais j'y peux rien.
Ceci dit, si quelqu'un à la solution, je suis toujours preneur ;)

Reply

Marsh Posté le 26-04-2004 à 15:29:00    

15 secondes tous les jours, génial.
et si par malheur ton poste plante, tu te le retapes...
 
vous voulez pas le foutre en fond d'écran plutot ?

Reply

Marsh Posté le 26-04-2004 à 15:34:55    

Non, pas en fond d'écran parce que l'application lit des données dans un fichier les valeurs qu'elle doit afficher, d'où la mise à jour de la chose. Je sais que ce serait plus pratique, mais ça va pas. Il faudrait vraiment une fenêtre non recouvrable...

Reply

Marsh Posté le 26-04-2004 à 15:34:55   

Reply

Marsh Posté le 26-04-2004 à 16:38:24    

Titalium a écrit :

Non, pas en fond d'écran parce que l'application lit des données dans un fichier les valeurs qu'elle doit afficher, d'où la mise à jour de la chose. Je sais que ce serait plus pratique, mais ça va pas. Il faudrait vraiment une fenêtre non recouvrable...


 
Ton patron est un nazi.
 

Code :
  1. private void splashOn(String file) {
  2.  splashLabel = new JLabel(new ImageIcon(getClass().getResource(file)));
  3.  splashScreen = new JWindow(this);
  4.  splashScreen.getContentPane().add(splashLabel);
  5.  splashScreen.pack();
  6.  Rectangle screenRect = getGraphicsConfiguration().getBounds();
  7.  splashScreen.setLocation(
  8.  screenRect.x + screenRect.width /2 - splashScreen.getSize().width /2,
  9.  screenRect.y + screenRect.height/2 - splashScreen.getSize().height/2);
  10.  splashScreen.show();
  11. }
  12.     private void splashOff() {
  13.      splashScreen.setVisible(false);
  14.      splashScreen = null;
  15.      splashLabel = null;
  16.     }


 
Mais même avec ça, c'est modal seuelement par rapport à ton appli.
Java te permettra jamais (à vér.) de chourrer le focus sur tout le système => m'étonnerais que ça soit portable sur tous les systèmes. Y'a que Windows qui se permet de te balancer une fenêtre super-modale. (Et encore, de moins en moins)

Reply

Marsh Posté le 27-04-2004 à 08:05:24    

Merci pour ton code Seabee, mais j'avais déjà trouvé comment rendre une fenêtre modale. Mais ça ne va pas pour mon affaire. De plus, cette fenêtre est la seule de l'application. Cette appli n'a vraiement comme seul objectif que d'afficher les objectifs.
 

Citation :

Mais même avec ça, c'est modal seuelement par rapport à ton appli.  
Java te permettra jamais (à vér.) de chourrer le focus sur tout le système => m'étonnerais que ça soit portable sur tous les systèmes. Y'a que Windows qui se permet de te balancer une fenêtre super-modale. (Et encore, de moins en moins)


 
C'est bien ce que je commence à craindre, du coup je sais pas trop comment je vais m'en sortir... Et avec un Listener sur la fenêtre et un évenement sur la perte de Focus qu'elle le reprenne ? Peut être ça marcherais. Je vais tester.

Reply

Marsh Posté le 27-04-2004 à 08:30:03    

Seabee a écrit :

Ton patron est un nazi.


 
+1 c'est trop fort de demander ça.


Message édité par jagstang le 27-04-2004 à 08:30:25
Reply

Marsh Posté le 27-04-2004 à 09:03:14    

JagStang a écrit :

+1 c'est trop fort de demander ça.


 
Pensez ce que vous voulez sur ces méthodes, c'est votre droit et je partage plus ou moins votre avis, mais mon patron n'est pas moi, ne me jugez pas non plus j'y suis pour rien. Je ne suis qu'un pauvre exécutant :cry:

Reply

Marsh Posté le 27-04-2004 à 09:14:07    

perso je te juge pas du tout, tu fais ton job. Mais il faut avouer que ce genre de méthode est plutôt débile... C'est un truc à avoir tout les employés à dos, et les railleries vont aller bon train.  
 
Y'a une bonne ambiance dans ta boite ?

Reply

Marsh Posté le 27-04-2004 à 09:44:54    

Oui, il y a plutôt une bonne ambiance générale dans ma boite, ça roule. Après, on a des postes qui chargent un max de truc au boot, et les machines sont pas toutes très puissantes, donc le temps de démarrage des postes est compris entre 30 secondes et 1 minute 30 à partir du moment où le user se log. Mon responsable proposait donc d'afficher cet écran d'objectif pendant que le reste des applications se chargent. Moi je suis pas sur que les gens se sentent pas mis sous pression avec ce genre de chose, mais force est d'avouer que c'est du temps de perdu.
Et puis je me fais pas d'illusion, les gens vont le matter les premières fois, et puis après il vont fouiner dans leurs dossier et tout ça pendant les 15 secondes d'affichage de cette fenêtre, ils la regarderont même plus au bout de trois jours. Maintenant, qu'on adhère ou pas à ces méthodes, ça me dit pas comment faire ;) Je crois que Java va avoir atteint ses limites de ce côté là. C'est pas forcément une mauvaise chose, mais c'est une possibilité de moins du langage par rapport à d'autres, et c'est dommage. Reste que je peux aussi empêcher la fermeture de la fenêtre pendant 15 secondes au moins, puis faire apparaitre un bouton "Fermer", ce qui imposera à l'utilisateur de remettre la fenêtre au premier plan pour s'en débarasser et cliquer sur le bouton. Pas très cool non plus, je suis bien d'accord. Un vrai splash aurait été le mieux.

Reply

Marsh Posté le 27-04-2004 à 10:56:36    

Ton idée avec le focus listener elle marche pas? J'y avais pas du tout pensé, mais ça doit faire l'affaire, non?
Sinon sur ton splash mets des fonctionnalités cachés bien pourraves (calendrier révolutionnaire, bonjour en 15 langues, photos de culs...) ça niquera la productivité de ta boite pendant une semaine,  c'est déjà ça de gagné sur ce terroriste.

Reply

Marsh Posté le 27-04-2004 à 11:12:48    

Mon idée de FocusListener, je sais pas si elle marche ou pas, j'arrive pas à la mettre en place... En effet, je trouve pas comment redonner le focus à ma fenêtre. Je pensais que JWindow possédais une méthode getFocus() ou un truc du genre, mais apparemment non. Si quelqu'un a une idée...

Reply

Marsh Posté le 27-04-2004 à 14:33:05    

Titalium a écrit :

Mon idée de FocusListener, je sais pas si elle marche ou pas, j'arrive pas à la mettre en place... En effet, je trouve pas comment redonner le focus à ma fenêtre. Je pensais que JWindow possédais une méthode getFocus() ou un truc du genre, mais apparemment non. Si quelqu'un a une idée...


 
Effectivement, tu ne pourras pas donner le focus à ton component.
Il te reste plus qu'à envoyer un beep système de malade quand le composant n'a plus le focus :lol:  :D  :lol:  
Va y avoir de l'ambiance, chez toi (jusqu'à ce que tout le monde débranche le haut parleur de l'UC  :sweat: )
 
 [:seabee]

Reply

Marsh Posté le 27-04-2004 à 14:35:08    

il y a une méthode requestFocus() quelque part...
 
Par contre le "always on top" n'existe pas en java.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 27-04-2004 à 15:50:44    

R3g a écrit :

il y a une méthode requestFocus() quelque part...
 
Par contre le "always on top" n'existe pas en java.


 
Ca pourrait être pas mal cette méthode tiens... Elle est dans quelle classe ? Elle peut s'appliquer à une JWindow ?

Reply

Marsh Posté le 27-04-2004 à 16:21:46    

Je viens de tenter un requestFocus() sur un événement focusLost de plusieurs composants, mais ça ne marche pas, ma fenêtre ne reviens pas devant :(
 
J'ai même essayé avec un JTextField, puisque dans la doc ils disent il faut que le composant soit focusable, visible, etc... Ben ça marche même pas, ouin ! ;)
 
Je sais pas trop comment faire là... Est-ce que ça viendrai de ma JWindow qui n'a pas de bouton dans la barre de tâche et tout ça ?

Reply

Marsh Posté le 27-04-2004 à 16:48:44    

Titalium a écrit :

Je viens de tenter un requestFocus() sur un événement focusLost de plusieurs composants, mais ça ne marche pas, ma fenêtre ne reviens pas devant :(
 
J'ai même essayé avec un JTextField, puisque dans la doc ils disent il faut que le composant soit focusable, visible, etc... Ben ça marche même pas, ouin ! ;)
 
Je sais pas trop comment faire là... Est-ce que ça viendrai de ma JWindow qui n'a pas de bouton dans la barre de tâche et tout ça ?

Deja pourquoi tu utilises une JWindow et pas une JFrame comme tout le monde ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 27-04-2004 à 18:10:26    

je fais des études de gestion, et je dois dire que je suis atteré par ces pratiques...si pour que les employés intègrent les objectifs de la boite t obligé de les spammer, je pense qu'il y a de gros problèmes au niveau de la GRH...
 
je compatis, ca doit faire chier d'executer des directives aussi connes...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 27-04-2004 à 18:30:43    

Jubijub a écrit :

je fais des études de gestion, et je dois dire que je suis atteré par ces pratiques...si pour que les employés intègrent les objectifs de la boite t obligé de les spammer, je pense qu'il y a de gros problèmes au niveau de la GRH...
 
je compatis, ca doit faire chier d'executer des directives aussi connes...


 
Ouai mais ça doit être reposant quand même, un splashscreen. La je suis en train d'analyser le soleil, on a pas idée ce que ça peut être complexe comme saleté, et puis en plus avec cette }=))ze:!ù: de SOHO qui est à 80% en panne et les capteurs qui changes de calibration tous les 2 jours et les [Ok, c'est rien, fatigue de fin de journée, j'arrête le 3615 MyLife :sweat: ]

Reply

Marsh Posté le 27-04-2004 à 18:46:46    

SOHO... 80%... *slurp*
 
:D


---------------
Fleur de métal, entité invulnérable, vêtue tant bien que mal, d'une muraille inébranlable...
Reply

Marsh Posté le 27-04-2004 à 19:06:02    

Code :
  1. import java.awt.*;
  2. /**
  3. * @author boubavic
  4. * Ma class splash screen difficile de faire + simple ;o)
  5. */
  6. public class SplashScreen extends Frame
  7. {
  8.     Image[] img;
  9.    
  10.     public SplashScreen()
  11.     {
  12.         super();
  13.         setSize(400,300);
  14.         setUndecorated( true );
  15.         setFocusable( false );
  16.         setEnabled( false );
  17.         String fileloc = "./images/logo.jpg";
  18.         img = new Image[1];
  19.         img[0] = this.getToolkit().createImage( fileloc );
  20.         try
  21.         {
  22.             MediaTracker mTrack = new MediaTracker( this ); // load les image avan de les afficher  
  23.             for ( int i = 0; i < img.length; i++ )
  24.                 mTrack.addImage( img[ i ], i );
  25.             mTrack.waitForAll();
  26.         } catch( Exception e ) { System.out.println(" setimages e : " + e ); }
  27.     }
  28.    
  29.     public void paint( Graphics g )
  30.     {
  31.         super.paint( g );
  32.         Dimension d = this.getSize();
  33.         g.drawImage( img[0], 0, 0, d.width, d.height, this ); // dessine l image  
  34.     }
  35.    
  36.     static public void main( String args[] )
  37.     {
  38.         try
  39.         {
  40.             GraphicsEnvironment ge = GraphicsEnvironment.
  41.             getLocalGraphicsEnvironment();
  42.             GraphicsDevice[] gs = ge.getScreenDevices();
  43.             GraphicsDevice gd = gs[0];
  44.             GraphicsConfiguration[] gc = gd.getConfigurations();
  45.             Rectangle r = gc[0].getBounds();
  46.             Point pt = new Point( (int)r.width/2, (int)r.height/2 );
  47.             SplashScreen sp = new SplashScreen();
  48.             Point loc = new Point( pt.x - 200, pt.y - 150 );
  49.             sp.setLocation( loc );
  50.             sp.setVisible(true);
  51.            
  52.             // apres fau metre le splash en parametre a l apli  
  53.             // et c elle ki fait le setvisible (false ) qd elle a fini de bosser  
  54.             // genre ( sur son setvisible( true ) ou a la fin du constructeur ou autre... ;o)  
  55.            
  56.            
  57.             //comme sa on peu pas la lancer plus tot ;o)
  58.            
  59.            
  60.         }
  61.         catch (Exception e)
  62.         {
  63.             System.out.println("enclosing_package.enclosing_method : " + e);
  64.         }
  65.     }
  66.    
  67. }


 
ca devrait marcher ca non ?
 
>> ben parce que j'ai qu'une image ... et ...c con :D mais bon si tu veux en mettre plus voila tu modifies le code...


Message édité par boubavic le 27-04-2004 à 19:24:56
Reply

Marsh Posté le 27-04-2004 à 19:18:55    

boubavic a écrit :


ca devrait marcher ca non ?

Utilises les balises [cpp] pour formater ton code, ce sera plus facile à lire. Faudrait aussi expliquer pourquoi tu fais un tableau de 1 image.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 28-04-2004 à 00:43:59    

myst78 a écrit :

SOHO... 80%... *slurp*
 
:D


 
 [:seabee] Koa?
Il l'on changé d'orientation pour mater je sais plus quel débris, et là il est en mode sucette. Grosso modo il envoie plus que les données de controle et des photos de culs.
En fait non. Juste les données de contrôle.
Quand au Splash...
 
[Edit : ça y est j'ai connecté. Non, le SOHO, c'est dans les 24°]


Message édité par seabee le 28-04-2004 à 00:45:54
Reply

Marsh Posté le 28-04-2004 à 09:10:13    

boubavic a écrit :


 
ca devrait marcher ca non ?
 
>> ben parce que j'ai qu'une image ... et ...c con :D mais bon si tu veux en mettre plus voila tu modifies le code...


 
Si j'ai bien compris ton code, il permet de faire un vrai Splash au sens de "Une fenêtre jolie et reposante qui fait patienter le user pendant que l'application s'initialise". Je vais ranger précieusement ton code, car il m'interesse pour une future application, mais par contre à priori cette façon de faire ne permet pas d'obliger la fenêtre du Splash à rester par dessus tout autre fenêtre (comme le ferait un fenêtre Delphi en StayOnTop par exemple).
Donc ça ne résoud toujours pas mon problème... Mais merci quand même, voila un code assez interessant :) :jap:

Reply

Marsh Posté le 28-04-2004 à 12:16:35    

Citation :

setAlwaysOnTop
 
public final void setAlwaysOnTop(boolean alwaysOnTop)
                          throws SecurityException
 
    Changes the always-on-top window state. An always-on-top window is a window that stays above all other windows except maybe other always-on-top windows. If there are several always-on-top windows the order in which they stay relative to each other is not specified and is platform dependent.
 
    If some other window already is always-on-top then the relative order between these windows is unspecified (depends on platform). No window can be brought to be over always-on-top window except maybe another always-on-top window.
 
    All owned windows of an always-on-top window automatically become always-on-top windows. If a window ceases to be always-on-top its owned windows cease to be always-on-top.
 
    When an always-on-top window is sent toBack its always-on-top state is set to false.
 
    This method makes the window always-on-top if alwaysOnTop is true. If the window is visible, this includes bringing window toFront, then "sticking" it to the top-most position. If the window is not visible it does nothing other than setting the always-on-top property. If later the window is shown, it will be always-on-top. If the Window is already always-on-top, this call does nothing.
 
    If alwaysOnTop is false this method changes the state from always-on-top to normal. The window remains top-most but its z-order can be changed in the normal way as for any other window. Does nothing if this Window is not always-on-top. Has no effect on relative z-order of windows if there are no other always-on-top windows.
 
    Note: some platforms might not support always-on-top windows. There is no public API to detect if the platform supports always-on-top at runtime.
 
    If a SecurityManager is installed, the calling thread must be granted the AWTPermission "setWindowAlwaysOnTop" in order to set the value of this property. If this permission is not granted, this method will throw a SecurityException, and the current value of the property will be left unchanged.
 
    Parameters:
        alwaysOnTop - new value of always-on-top state of the window  
    Throws:
        SecurityException - if the calling thread does not have permission to set the value of always-on-top property
    Since:
        1.5

    See Also:
        isAlwaysOnTop(), toFront(), toBack(), AWTPermission
 


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 28-04-2004 à 13:11:46    

Mais c'est nickel ça ! Problème : je suis en 1.4.0 du JDK, et j'ai que un RTC au boulot :cry:
 
Va falloir que j'aille chez un pote qui a ADSL je crois là... Merci beaucoup r3g, je crois que tu me sauve la mise là ! :jap:


Message édité par Titalium le 28-04-2004 à 13:14:35
Reply

Marsh Posté le 28-04-2004 à 13:13:55    

Titalium a écrit :

Mais c'est nickel ça ! Problème : je suis en 1.4.0 du SDK, et j'ai que un RTC au boulot :cry:
 
Va falloir que j'aille chez un pote qui a ADSL je crois là... Merci beaucoup r3g, je crois que tu me sauve la mise là ! :jap:


 
Et puis tu vas avoir le droit de te tapper l'install d'une 1.5 sur toutes bécanes de ton bureau  :sol:  
Quel pied  :D  

Reply

Marsh Posté le 28-04-2004 à 13:15:56    

Aussi oui, je vais m'amuser comme un p'tit fou :)
 
Remarque une fois que c'est fait, ben ce sera pas une install à refaire pour les autres softs que je vais développer un Java, c'est juste un mauvais moment à passer... :/

Reply

Marsh Posté le 28-04-2004 à 13:27:25    

Précisons tout de même que le jdk 1.5 est encore en version beta...


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 28-04-2004 à 13:29:38    

pourquoi pas prendre juste cette classe pour l'integrer dans ton appli ?


---------------
IVG en france
Reply

Marsh Posté le 28-04-2004 à 13:34:35    

uriel a écrit :

pourquoi pas prendre juste cette classe pour l'integrer dans ton appli ?


 
Pourquoi pas, c'est pas une mauvaise idée... Quelqu'un pourrait me l'envoyer svp ? je peux lacher une adresse en PV si une bonne âme peut me secourir...

Reply

Marsh Posté le 28-04-2004 à 13:45:52    

uriel a écrit :

pourquoi pas prendre juste cette classe pour l'integrer dans ton appli ?

la classe en question c'est java.awt.Window ; à mon avis c'est tout java.awt qu'il va falloir importer, sans parler des libs natives du JRE...


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 28-04-2004 à 13:46:43    

R3g a écrit :

la classe en question c'est java.awt.Window ; à mon avis c'est tout java.awt qu'il va falloir importer, sans parler des libs natives du JRE...


 
ca se complique, je pensais juste importer java.awt.Window


---------------
IVG en france
Reply

Marsh Posté le 28-04-2004 à 13:50:29    

uriel a écrit :

ca se complique, je pensais juste importer java.awt.Window

il faudrait regarder le code source, mais Window herite de Container, qui hérite de Component, qui implémente tout un tas d'interfaces, etc..
En plus la notion de always on top était complètement absente des précédentes version d'awt, il a donc du y avoir de gros changements au niveau de l'interface avec le système de fenêtrage de l'OS.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed