¿Abrir un enlace en el navegador con el botón Java? [duplicar]

103

¿Cómo puedo abrir un enlace en el navegador predeterminado con un clic de botón, a lo largo de las líneas de

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

?

Malasuerte94
fuente
2
¡Es posible que haya intentado buscar JavaDocs para la clase que se usa en la respuesta aceptada de su última pregunta ! Esos docs. son muy útiles, adjúntelos a su IDE o marque la versión en línea.
Andrew Thompson
Pregunta duplicada: stackoverflow.com/q/5226212/873282
koppor

Respuestas:

223

Utilice el método Desktop # Browse (URI) . Abre un URI en el navegador predeterminado del usuario.

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;
}
FThompson
fuente
esto no parece funcionar en archivos JAR creados por Netbeans 7.x. Funciona cuando el código se ejecuta desde Netbeans, pero no cuando se implementa como un archivo JAR ... al menos en mi experiencia. Sigo buscando una solución.
MountainX
@MountainX Depura y verifica que el escritorio sea compatible y que las implementaciones de seguridad no te impidan acceder a la instancia del escritorio. Si está ejecutando el JAR como un subprograma, la seguridad es probablemente el culpable.
FThompson
@ Vulcan: no estoy ejecutando el JAR como un applet. No conozco ninguna configuración de seguridad que impida que esto funcione. "Trabajé alrededor" llamando new ProcessBuilder("x-www-browser", uri.toString());. Pensaría que si hubiera restricciones de seguridad, la llamada a ProcessBuilder no funcionaría. Pero funciona. No tengo idea de por qué desktop.browse(uri)no funciona, pero he visto que no funciona para mucha gente. Supuse que tal vez sea un problema de Netbeans, pero no lo sé.
MountainX
Si el usuario ha asignado una acción personalizada "abrir con" a la extensión del archivo como "html", esto NO abrirá el navegador, sino el programa con el que el usuario lo ha vinculado ... ¡Esto no es una solución en absoluto!
Santo-
@thesaint Gran punto; una alternativa openWebpagepodría usar Runtime.exec(..)e iterar a través de un conjunto predefinido de nombres de navegador populares, pasándoles la URL. Sin embargo, eso también tiene la advertencia de no ejecutarse para usuarios con navegadores oscuros, pero lo escribiré y lo agregaré a esta respuesta pronto, cuando tenga un momento libre.
FThompson
37
public static void openWebpage(String urlString) {
    try {
        Desktop.getDesktop().browse(new URL(urlString).toURI());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Daniel
fuente
25
try {
    Desktop.getDesktop().browse(new URL("http://www.google.com").toURI());
} catch (Exception e) {}

nota: debe incluir las importaciones necesarias de java.net

AdelM
fuente
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());
    }
}
em
fuente
0

Sé que esta es una pregunta antigua, pero a veces Desktop.getDesktop()produce un bloqueo inesperado como en Ubuntu 18.04. Por lo tanto, tengo que volver a escribir mi código así:

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;
}

Entonces podemos llamar a este ayudante desde la instancia:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        MUtils.openURL("www.google.com"); // just what is the 'open' method?
    }
});
Teocci
fuente
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);
    }
}
em
fuente