Link im Browser mit Java-Button öffnen? [Duplikat]


103

Wie kann ich einen Link im Standardbrowser mit einem Klick auf die Schaltfläche öffnen?

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

?


2
Möglicherweise haben Sie versucht, in den JavaDocs nach der Klasse zu suchen , die in der akzeptierten Antwort auf Ihre letzte Frage verwendet wird ! Diese Dokumente. sind sehr praktisch, hängen Sie sie entweder an Ihre IDE an oder setzen Sie ein Lesezeichen für die Online-Version.
Andrew Thompson

Antworten:


223

Verwenden Sie die URI- Methode (Desktop # browse) . Es öffnet sich eine URI im Standardbrowser des Benutzers.

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

Dies scheint in JAR-Dateien, die von Netbeans 7.x erstellt wurden, nicht zu funktionieren. Es funktioniert, wenn der Code von Netbeans ausgeführt wird, aber nicht, wenn es als JAR-Datei bereitgestellt wird ... zumindest nach meiner Erfahrung. Ich suche immer noch nach einer Lösung.
MountainX

@MountainX Debuggen Sie und stellen Sie sicher, dass der Desktop unterstützt wird und dass Sicherheitsimplementierungen Sie nicht am Zugriff auf die Desktopinstanz hindern. Wenn Sie die JAR als Applet ausführen, ist Sicherheit wahrscheinlich der Schuldige.
FThompson

@ Vulcan - Ich führe die JAR nicht als Applet aus. Mir sind keine Sicherheitseinstellungen bekannt, die dies verhindern würden. Ich habe es "umgangen", indem ich angerufen habe new ProcessBuilder("x-www-browser", uri.toString());. Sie würden denken, dass der ProcessBuilder-Aufruf bei Sicherheitsbeschränkungen nicht funktionieren würde. Aber es funktioniert. Ich habe keine Ahnung, warum desktop.browse(uri)es nicht funktioniert, aber ich habe gesehen, dass es bei vielen Menschen nicht funktioniert. Ich habe vermutet, dass es sich möglicherweise um ein Netbeans-Problem handelt, aber ich weiß es nicht.
MountainX

Wenn der Benutzer der Datei Exten wie "html" eine benutzerdefinierte Aktion "Öffnen mit" zugewiesen hat, wird der Browser NICHT geöffnet, sondern das Programm, mit dem der Benutzer ihn verknüpft hat. Dies ist überhaupt keine Lösung!
Heilige

@thesaint Großartiger Punkt; Eine Alternative openWebpagekönnte Runtime.exec(..)einen vordefinierten Satz beliebter Browsernamen verwenden und durchlaufen und ihnen die URL übergeben. Das hat auch die Einschränkung, dass es nicht für Benutzer mit obskuren Browsern ausgeführt wird, aber ich werde es bald schreiben und zu dieser Antwort hinzufügen, wenn ich einen freien Moment habe.
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) {}

Hinweis: Sie müssen die erforderlichen Importe aus einschließen 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

Ich weiß, dass dies eine alte Frage ist, aber manchmal Desktop.getDesktop()führt dies zu einem unerwarteten Absturz wie in Ubuntu 18.04. Daher muss ich meinen Code folgendermaßen neu schreiben:

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

Dann können wir diesen Helfer von der Instanz aus aufrufen:

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);
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.