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 :

Desktop.browse() non portable ?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Février 2007
    Messages : 80
    Par défaut Desktop.browse() non portable ?
    Bonjour,

    Objectif : ouvrir un lien hypertexte d'un JEditorPane dans le browser par défaut.

    J'ai le problème suivant :
    J'appelle la méthode Desktop.browse() dans un HyperLinkUpdate qui me renvoit l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    java.io.IOException: Failed to show URI:http://www.developpez.net
            at sun.awt.X11.XDesktopPeer.launch(XDesktopPeer.java:75)
            at sun.awt.X11.XDesktopPeer.browse(XDesktopPeer.java:64)
    Je travaille sous Fedora (KDE). J'ai ensuite fait le test sous une CentOS (gnome) et ça marchait comme une fleur. Je suppose que je n'aurais pas rencontré de problèmes avec un Windows non plus.

    Après quelques recherches je tombe sur bug 6486393 et sur issue 92306 qui confirment qui confirme que Desktop ne fonctionne qu'avec Windows et Gnome (me corriger si je me trompre).

    Mon peu d'expérience ne me permet pas de rebondir... quelles solutions s'offrent à moi pour atteindre l'objectif ? C'est à dire ouvrir le navigateur par défaut quelque soit mon système ?

    J'image qu'il y a des solutions. NetBeans, par exemple, appelle Firefox (avec la Fedora 8) sans problème. J'ai essayé de regarder le sources mais je m'y noie...
    Je ne souhaite pas utiliser de JWebPane.

    D'avance merci pour vos conseils.
    Philippe.

  2. #2
    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 : 45
    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
    tu peux toujours catcher l'erreur, et en cas de problème essayer de retomber sur tes pattes (Runtime.exec() + firefox, IE, konqueror, opera ...) y a aussi sur certains linux $BROWSER

  3. #3
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 679
    Par défaut
    A priori sur linux pas trop ancien, pour démarer un fichier ou une url avec son application par défaut, la commande serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec("xdg-open 'http://mon.url.com'");

  4. #4
    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,


    La classe Desktop n'est pas 100% portable, c'est indiqué dans la doc et il faut vérifier le support des fonctions avec Desktop.isDesktopSupported() et isSupported(Desktop.Action.BROWSE)...

    Le problème étant que cela n'est pas réellement portable et fortement dépendant du système. Si on veut être le plus portable possible il faut proposer un code alternatif.


    Sous Linux $BROWSER n'est pas forcément renseigné, et xdg-open pas forcément installé... et il y a d'autres outils du même genre dépendant de l'environnement...

    Bref il faudrait tester de tous les appeler, et si aucun n'est présent d'appeler directement les navigateurs...


    Ce qui pourrait donner :
    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
    	public static void browse(URI uri) throws IOException {
     
    		// On tente d'abord avec la classe Desktop
    		try {
    			if (Desktop.isDesktopSupported()) {
    				Desktop.getDesktop().browse(uri);
    				// Si on arrive ici cela signifie que l'on a réussi
    				// => On sort de la méthode
    				return; // OK
    			}
    		} catch (IOException e) {
    			// ignored
    			System.err.println("Desktop.browse() : " + e.getMessage());
    		}
     
     
    		// Sinon on tente d'appeler directement le navigateur
    		String[] commands = {
    				// En utilisant la variable d'environnement $BROWSER (si elle existe)
    				System.getenv("BROWSER"),
    				// En utilisant les outils "génériques" des environnements de bureau :
    				"xdg-open",			// multi
    				"kfmclient exec",	// KDE
    				"exo-open",			// XFCE
    				"gnome-open",		// Gnome
    				// En appellant directement les navigateurs
    				"firefox",
    				"konqueror",
    				"netscape"
    				};
     
    		for (String cmd : commands) {
    			if (cmd !=null) { // $BROWSER peut être null
    				try {
    					browse(cmd, uri);
    					return; // OK
    				} catch (IOException e) {
    					// ignored
    					System.err.println(cmd + " : " + e.getMessage());
    				}
    			}
    		}
     
    		// Si on arrive ici cela signifie que l'on n'est arrivé à rien :
    		throw new IOException("no browser found");
    	}
     
    	/*
    	 * Utilise la commande pour ouvrir une URI
    	 */
    	private static void browse(String command, URI uri) throws IOException {
    		// On découpe d'abord la commande
    		// (c'est préférable pour Runtime.exec()).
    		String[] args = command.split(" +");
    		args = Arrays.copyOf(args, args.length+1);
    		args[args.length-1] = uri.toString();
     
    		// Et on tente de lancer le process 
    		final Runtime runtime = Runtime.getRuntime();
    		final Process process = runtime.exec(args);
    		// On ferme les flux pour éviter les deadlocks ;)
    		process.getOutputStream().close();
    		process.getInputStream().close();
    		process.getErrorStream().close();
    	}
    Bien sûr on pourrait rajouter d'autres programmes dans la liste des programmes appelées

    a++


    PS : En général je n'aime pas vraiment utiliser de multiple return, mais ici je trouve que cela s'applique assez bien...

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Février 2007
    Messages : 80
    Par défaut
    Bonjour,

    Merci à tous les trois pour vos réponses.

    Je n'avais pas précisé dans le premier message que Desktop.isDesktopSupported() et isSupported(Desktop.Action.BROWSE) me renvoyaient true. C'est pour ça que je cherchais plutôt un bug qu'une erreur dans le code.

    xdg-open m'a mis sur la voie parce que ça buggait aussi... j'ai compris alors que mes préférences (dans mon environnement) pour "navigateur par défaut" étaient mal configurées... D'où les erreurs de Desktop.browse() et de xdg-open ! En modifiant ça, tout marche très bien, même Desktop.browser(). Merci pour vos bonnes idées

    adiGuba, merci pour cette méthode complète. Toujours très pédagogique tes réponses, j'apprends à chaque fois !
    Dans la dernière IOException("no browser found"), je pense que c'est le bon endroit pour dire à l'utilisateur de s'assurer que le navigateur par défaut est correctement configuré. C'est ce qui m'est arrivé en fait.

    Bien sûr on pourrait rajouter d'autres programmes dans la liste des programmes appelées
    Je suppose que tu faisais référence à des programmes comme Flock, Links ou Safari

    Philippe

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

Discussions similaires

  1. Incomprehensible :/ (Pointeur non portable)
    Par skip78 dans le forum C
    Réponses: 66
    Dernier message: 06/09/2006, 09h57
  2. .exe non portable?
    Par poukill dans le forum C++
    Réponses: 41
    Dernier message: 16/06/2006, 11h09
  3. Framework .NET 2.0: application non portable
    Par alceste dans le forum C++
    Réponses: 10
    Dernier message: 16/06/2006, 08h20
  4. comparaison de pointeur non portable
    Par kykyn dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 10h58
  5. Probléme de code non portable
    Par Stany dans le forum Windows
    Réponses: 2
    Dernier message: 23/08/2005, 11h02

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