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

?


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,

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

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

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



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

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

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);
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.