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

Java Discussion :

Forcer l'arrêt du programme


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut Forcer l'arrêt du programme
    Bonjour,

    Je travaille actuellement sur une petite interface en java, qui permet de faciliter la recherche de fichier dans une arborescence "monstrueuse".
    Cette interface devant par la suite être utilisée par des personnes non-spécialistes de l'informatique.
    A cette fin, il y aura (en plus du code) un fichier de configuration modifiable facilement.
    Jusque là, ça va
    Le soucis est que toutes les personnes qui auront l'utilité de cette interface n'ont pas les mêmes écrans (en nombre et en taille), donc je ne peux pas fixer de valeur arbitraires pour le positionnement de ma fenêtre d'interface.
    Donc le nombre d'écran est récupérable dans le fichier de configuration (la variable nbEcrans du code suivant).

    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
    public void centreEcran(int w,int h,int nbEcrans)
    	{
    		try
    		{
    			Toolkit tk=Toolkit.getDefaultToolkit();
    			Dimension dim=tk.getScreenSize();
    			int X=(dim.width-w)/(nbEcrans*2); //centre au milieu de l'écran n°1
    			int Y=(dim.height-h)/2;
    			this.setBounds(X,Y,w,h);
    		}
    		catch(ArithmeticException e)
    		{
    			System.out.println("erreur dans la configuration, vous ne pouvez pas avoir 0 ecran !");
    		}
    	}
    Comme vous pouvez le voir avec mon calcul, le fait d'avoir la valeur 0 dans le fichier de configuration déclenche une exception (tout à fait normal).
    Le soucis c'est que le programme m'ouvre quand même une minuscule fenêtre (agrandissable mais pas top) un peu n'importe où sur l'ecran (souvent en haut à gauche mais pas toujours).
    Donc ce que je voudrais, ça serait que dans le cas de l'exception (0 écran donc), le programme soit interrompu et fermé (pas juste caché quelque part).

    Le développement (compilation+execution) est fait sous console UNIX, mais le programme ne tournera probablement pas sur ce même environnement. Sachant que les personnes qui s'en serviront ne sont pas spécialistes en informatique, le Ctrl+C n'est pas la solution.

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 165
    Par défaut
    Salut,

    essaie avec

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Je pense que tu t'y prend très mal !
    Ton calcul pour placer la fenêtre sur un écran spécifique m'a l'air un peu alambiqué !

    Déjà si tu veux gérer plusieurs écrans, il faut que tu en récupères la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GraphicsDevice[] devices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
    Ensuite, pour afficher une fenêtre sur un écran spécifique, il faut l'initialiser avec la configuration graphique associé à l'écran, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GraphicsConfiguration gc = devices[0].getDefaultConfiguration();
    JFrame frame = new JFrame(gc);
    Ensuite, il suffit d'utiliser setLocationRelativeTo() pour centrer la fenêtre par rapport à une autre ou par rapport à son écran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame.setLocationRelativeTo(null); // centre sur l'écran
    Bien sûr la fenêtre doit déjà être construite et dimensionnée...




    Enfin, pour revenir au problème de l'exception :
    • Soit tu la traites et dans ce cas tu implémentes une solution alternative.
    • Soit tu la laisse remonter en faisant planter le programme (en affichant un "joli" message avec un UncaughtExceptionHandler par exemple).



    Mais tu ne dois en aucun cas te contenter d'un catch qui se contente d'afficher un message comme celui de ton message. Surtout dans une application graphique !!!

    Car le problème passera totalement inaperçu pour l'utilisateur (en général une application graphique est détaché de la console) mais provoquera d'autres résultats incorrects plus ou moins compréhensible... Il vaut mieux s'arrêter au plus tôt !


    a++

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    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 482
    Par défaut
    je rajouterais: quand vous savez qu'il y a N écrans, vous ne savez pas nécessairement comment ils sont disposés (horizontalement, verticalement, en carré, etc). Le mieux est de se centrer sur l'écran 0 à sa taille. ensuite, l'utilisateur redimensionne la fenetre à son gout. Et si vous voulez pas qu'il le face à chaque fois, vous sauvez la nouvelle taille + position dans le fichier de config vous meme à la fermeture

    ce ce que fait mon ide eclipse au passage, il sauve la taille et la position de chacune de ses fenetres, ainsi je les récupère au démarrage suivant

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 18
    Par défaut
    j'ai testé votre méthode adiGuba, mais apparement la machine sur laquelle je suis considère les 2 écrans comme un seul.

    $ run
    X11GraphicsDevice[screen=0]
    Java Accessibility for GNOME loaded.

    $
    Et la fenetre se met à cheval sur les 2 écrans (run est juste un alias)

    pour la seconde ligne affichée, voilà le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void main(String[] args)
    {
    	GraphicsDevice[] devices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
    	for(int i=0;i<devices.length;i++)
    		System.out.println(devices[i])
    	GraphicsConfiguration gc=devices[0].getDefaultConfiguration();
    	JFramePerso frame=new JFramePerso("test",gc,400,170); //titre, graphics configuration, largeur, hauteur
    	frame.setLocationRelativeTo(null);
    }
    Merci quand même

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dracorb Voir le message
    j'ai testé votre méthode adiGuba, mais apparement la machine sur laquelle je suis considère les 2 écrans comme un seul.
    Ah !?
    La carte graphique doit cacher cela à l'OS et simuler un écran très large.

    Dans ce cas oui tu devras calculer toutes les coordonnées...

    a++

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    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 482
    Par défaut
    c'est surtout le window manager qui cache ça Suivant la configuration du window manager sous linux, c'est vu comme un ou deux écran.Et même sous linux, au fur et à mesure de mes migrations ubuntu, je suis passé de 1 à 2 écrans sans rien changer au matériel

    Simplement le window manager a fini par décider qu'il déclarerait enfin 2 écrans.

    Mais bon. Si le windows manager ne te dit pas qu'il y a 2 écran, tu ne pourra rien y faire, aucun moyen de détecter (d'où ma suggestion de laisser l'utilisateur redimensionner)
    Si le windows manager exporte l'info, vous pouvez vous contenter d'afficher une fenetre maximisée, elle le sera sur un seul écran.

Discussions similaires

  1. Forcer l'arrêt du système
    Par vg-matrix dans le forum Windows 7
    Réponses: 2
    Dernier message: 23/08/2009, 14h55
  2. Réponses: 5
    Dernier message: 29/12/2007, 00h03
  3. [Système] Arrêt du programme
    Par milach dans le forum Langage
    Réponses: 2
    Dernier message: 26/09/2007, 22h34
  4. [MOSS] Forcer l'arrêt/redémarrage du service de recherche ?
    Par Leparachute dans le forum SharePoint
    Réponses: 3
    Dernier message: 26/07/2007, 16h16
  5. [C#]Arrêt du programme
    Par torNAdE dans le forum Windows Forms
    Réponses: 10
    Dernier message: 06/05/2006, 00h15

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