Ouvrir un lien dans le navigateur avec le bouton java? [dupliquer]


103

Comment puis-je ouvrir un lien dans le navigateur par défaut en cliquant sur un bouton, dans le sens de

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        open("www.google.com"); // just what is the 'open' method?
    }
});

?


2
Vous avez peut-être essayé de consulter les JavaDocs pour la classe utilisée dans la réponse acceptée à votre dernière question ! Ces documents. sont très pratiques, attachez-les à votre IDE ou ajoutez la version en ligne à vos favoris.
Andrew Thompson

Réponses:


223

Utilisez la méthode Desktop # Browse (URI) . Il ouvre un URI dans le navigateur par défaut de l'utilisateur.

public static boolean openWebpage(URI uri) {
    Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
    if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
        try {
            desktop.browse(uri);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return false;
}

public static boolean openWebpage(URL url) {
    try {
        return openWebpage(url.toURI());
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    return false;
}

cela ne semble pas fonctionner dans les fichiers JAR créés par Netbeans 7.x. Cela fonctionne lorsque le code est exécuté à partir de Netbeans, mais pas lorsqu'il est déployé en tant que fichier JAR ... du moins d'après mon expérience. Je cherche toujours une solution.
MountainX

@MountainX Debug et vérifiez que le bureau est pris en charge et que les implémentations de sécurité ne vous empêchent pas d'accéder à l'instance de bureau. Si vous exécutez le JAR en tant qu'applet, la sécurité est probablement le coupable.
FThompson

@ Vulcan - Je n'exécute pas le JAR en tant qu'applet. Je ne connais aucun paramètre de sécurité qui empêcherait cela de fonctionner. Je l'ai "contourné" en appelant new ProcessBuilder("x-www-browser", uri.toString());. Vous penseriez que s'il y avait des restrictions de sécurité, l'appel ProcessBuilder ne fonctionnerait pas. Mais, il fonctionne. Je ne sais pas pourquoi desktop.browse(uri)cela ne fonctionne pas, mais j'ai vu que cela ne fonctionne pas pour beaucoup de gens. J'imaginais que c'était peut-être un problème Netbeans, mais je ne sais pas.
MountainX

Si l'utilisateur a assigné une action personnalisée "ouvrir avec" au fichier exten comme "html" alors cela n'ouvrira PAS le navigateur, mais le programme avec lequel l'utilisateur l'a lié .... Ce n'est pas du tout une solution!
thesaint

@thesaint Grand point; une alternative openWebpagepourrait utiliser Runtime.exec(..)et parcourir un ensemble prédéfini de noms de navigateurs populaires, en leur passant l'URL. Cela a également la mise en garde de ne pas fonctionner pour les utilisateurs avec des navigateurs obscurs, mais je l'écrirai et l'ajouterai bientôt à cette réponse lorsque j'aurai un moment libre.
FThompson

37
public static void openWebpage(String urlString) {
    try {
        Desktop.getDesktop().browse(new URL(urlString).toURI());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

25
try {
    Desktop.getDesktop().browse(new URL("http://www.google.com").toURI());
} catch (Exception e) {}

Remarque: vous devez inclure les importations nécessaires depuis java.net



3
private void ButtonOpenWebActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try {
        String url = "https://www.google.com";
        java.awt.Desktop.getDesktop().browse(java.net.URI.create(url));
    } catch (java.io.IOException e) {
        System.out.println(e.getMessage());
    }
}

0

Je sais que c'est une vieille question mais parfois cela Desktop.getDesktop()produit un crash inattendu comme dans Ubuntu 18.04. Par conséquent, je dois réécrire mon code comme ceci:

public static void openURL(String domain)
{
    String url = "https://" + domain;
    Runtime rt = Runtime.getRuntime();
    try {
        if (MUtils.isWindows()) {
            rt.exec("rundll32 url.dll,FileProtocolHandler " + url).waitFor();
            Debug.log("Browser: " + url);
        } else if (MUtils.isMac()) {
            String[] cmd = {"open", url};
            rt.exec(cmd).waitFor();
            Debug.log("Browser: " + url);
        } else if (MUtils.isUnix()) {
            String[] cmd = {"xdg-open", url};
            rt.exec(cmd).waitFor();
            Debug.log("Browser: " + url);
        } else {
            try {
                throw new IllegalStateException();
            } catch (IllegalStateException e1) {
                MUtils.alertMessage(Lang.get("desktop.not.supported"), MainPn.getMainPn());
                e1.printStackTrace();
            }
        }
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
}

public static boolean isWindows()
{
    return OS.contains("win");
}

public static boolean isMac()
{
    return OS.contains("mac");
}

public static boolean isUnix()
{
    return OS.contains("nix") || OS.contains("nux") || OS.indexOf("aix") > 0;
}

Ensuite, nous pouvons appeler cet assistant à partir de l'instance:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        MUtils.openURL("www.google.com"); // just what is the 'open' method?
    }
});

0
public static void openWebPage(String url) {
    try {
        Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
        if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
            desktop.browse(new URI(url));
        }
        throw new NullPointerException();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, url, "", JOptionPane.PLAIN_MESSAGE);
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.