Otworzyć łącze w przeglądarce za pomocą przycisku java? [duplikować]

103

Jak otworzyć łącze w domyślnej przeglądarce za pomocą kliknięcia przycisku, na wzór

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

?

Malasuerte94
źródło
2
Być może spróbowałeś spojrzeć na JavaDocs w poszukiwaniu klasy użytej w zaakceptowanej odpowiedzi na twoje ostatnie pytanie ! Te dokumenty. są bardzo przydatne, dołącz je do swojego IDE lub dodaj do zakładek wersję on-line.
Andrew Thompson,
Zduplikowane pytanie: stackoverflow.com/q/5226212/873282
koppor

Odpowiedzi:

223

Użyj metody Desktop # Browse (URI) . Otwiera identyfikator URI w domyślnej przeglądarce użytkownika.

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
źródło
to nie działa w plikach JAR utworzonych przez Netbeans 7.x. Działa, gdy kod jest uruchamiany z Netbeans, ale nie po wdrożeniu jako plik JAR ... przynajmniej z mojego doświadczenia. Wciąż szukam rozwiązania.
MountainX
@MountainX Debuguj i sprawdź, czy pulpit jest obsługiwany i czy implementacje zabezpieczeń nie ograniczają dostępu do instancji pulpitu. Jeśli uruchamiasz plik JAR jako aplet, prawdopodobnie przyczyną jest bezpieczeństwo.
FThompson
@ Vulcan - nie uruchamiam JARa jako apletu. Nie znam żadnych ustawień zabezpieczeń, które uniemożliwiłyby to działanie. „Obejrzałem” to dzwoniąc new ProcessBuilder("x-www-browser", uri.toString());. Można by pomyśleć, że gdyby istniały ograniczenia bezpieczeństwa, wywołanie ProcessBuilder nie działałoby. Ale to działa. Nie mam pojęcia, dlaczego desktop.browse(uri)nie działa, ale widziałem, że nie działa to dla wielu ludzi. Domyślałem się, że może to problem z Netbeans, ale nie wiem.
MountainX
Jeśli użytkownik przypisał niestandardową akcję „otwórz za pomocą” do rozszerzenia pliku, np. „Html”, NIE spowoduje to otwarcia przeglądarki, ale program, z którym użytkownik ją połączył… To nie jest w ogóle rozwiązanie!
świętego
@thesaint Świetna uwaga; alternatywą openWebpagemogłoby być użycie Runtime.exec(..)wstępnie zdefiniowanego zestawu popularnych nazw przeglądarek i jego iteracja, przekazując im adres URL. Ma to również zastrzeżenie, że nie działa dla użytkowników z mało znanymi przeglądarkami, ale napiszę i dodam to do tej odpowiedzi wkrótce, gdy będę miał wolną chwilę.
FThompson
37
public static void openWebpage(String urlString) {
    try {
        Desktop.getDesktop().browse(new URL(urlString).toURI());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Daniel
źródło
25
try {
    Desktop.getDesktop().browse(new URL("http://www.google.com").toURI());
} catch (Exception e) {}

uwaga: musisz uwzględnić niezbędne importy z java.net

AdelM
źródło
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());
    }
}
SM
źródło
0

Wiem, że to stare pytanie, ale czasami Desktop.getDesktop()powoduje nieoczekiwaną awarię, jak w Ubuntu 18.04. Dlatego muszę przepisać mój kod w ten sposób:

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

Następnie możemy wywołać tego pomocnika z instancji:

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