Abrir um link no navegador com o botão java? [duplicado]

103

Como posso abrir um link no navegador padrão com um clique de botão, ao longo das linhas de

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

?

Malasuerte94
fonte
2
Você pode ter tentado olhar os JavaDocs para a classe que é usada na resposta aceita de sua última pergunta ! Esses docs. são muito úteis, anexe-os ao seu IDE ou marque a versão on-line.
Andrew Thompson
Pergunta duplicada: stackoverflow.com/q/5226212/873282
koppor

Respostas:

223

Use o método Desktop # browse (URI) . Ele abre um URI no navegador padrão do usuário.

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
fonte
isso não parece funcionar em arquivos JAR criados pelo Netbeans 7.x. Funciona quando o código é executado no Netbeans, mas não quando implantado como um arquivo JAR ... pelo menos na minha experiência. Ainda estou procurando uma solução.
MountainX de
@MountainX Depure e verifique se o desktop é compatível e se as implementações de segurança não estão impedindo você de acessar a instância do desktop. Se você estiver executando o JAR como um miniaplicativo, a segurança é o provável culpado.
FThompson
@ Vulcan - Não estou executando o JAR como um miniaplicativo. Não estou ciente de nenhuma configuração de segurança que possa impedir que isso funcione. Eu "contornei" isso ligando new ProcessBuilder("x-www-browser", uri.toString());. Você pensaria que, se houvesse restrições de segurança, a chamada do ProcessBuilder não funcionaria. Mas funciona. Não tenho ideia de por desktop.browse(uri)que não funciona, mas tenho visto que não funciona para muitas pessoas. Achei que talvez seja um problema do Netbeans, mas não sei.
MountainX de
Se o usuário atribuiu uma ação personalizada "abrir com" ao arquivo exten como "html", isso NÃO abrirá o navegador, mas o programa ao qual o usuário o vinculou ... Isso não é uma solução de forma alguma!
TheSaint
@thesaint Ótimo ponto; uma alternativa openWebpagepoderia usar Runtime.exec(..)e iterar por meio de um conjunto predefinido de nomes de navegadores populares, passando-lhes o URL. Isso também tem a ressalva de não funcionar para usuários com navegadores obscuros, mas irei escrever e adicioná-lo a esta resposta em breve, quando tiver um momento livre.
FThompson
37
public static void openWebpage(String urlString) {
    try {
        Desktop.getDesktop().browse(new URL(urlString).toURI());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Daniel
fonte
25
try {
    Desktop.getDesktop().browse(new URL("http://www.google.com").toURI());
} catch (Exception e) {}

nota: você deve incluir as importações necessárias de java.net

AdelM
fonte
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
fonte
0

Eu sei que esta é uma pergunta antiga, mas às vezes Desktop.getDesktop()produz uma falha inesperada como no Ubuntu 18.04. Portanto, tenho que reescrever meu código assim:

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

Em seguida, podemos chamar esse auxiliar da instância:

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