Aprire un collegamento nel browser con il pulsante java? [duplicare]


103

Come posso aprire un collegamento nel browser predefinito con un clic del pulsante, sulla falsariga di

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

?


2
Potresti aver provato a guardare i JavaDocs per la classe utilizzata nella risposta accettata della tua ultima domanda ! Quei documenti. sono molto utili, allegali al tuo IDE o aggiungi ai segnalibri la versione online.
Andrew Thompson

Risposte:


223

Usa il metodo Desktop # browse (URI) . Apre un URI nel browser predefinito dell'utente.

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

questo non sembra funzionare nei file JAR creati da Netbeans 7.x. Funziona quando il codice viene eseguito da Netbeans, ma non quando viene distribuito come file JAR ... almeno nella mia esperienza. Sto ancora cercando una soluzione.
MountainX

@MountainX Esegui il debug e verifica che il desktop sia supportato e che le implementazioni di sicurezza non ti impediscano di accedere all'istanza desktop. Se stai eseguendo il JAR come applet, la sicurezza è il probabile colpevole.
FThompson

@ Vulcan - Non sto eseguendo il JAR come applet. Non sono a conoscenza di alcuna impostazione di sicurezza che ne impedirebbe il funzionamento. L'ho "aggirato" chiamando new ProcessBuilder("x-www-browser", uri.toString());. Si potrebbe pensare che se ci fossero limitazioni di sicurezza, la chiamata a ProcessBuilder non funzionerebbe. Ma funziona. Non ho idea del perché desktop.browse(uri)non funzioni, ma ho visto che non funziona per molte persone. Stavo indovinando che forse è un problema di Netbeans, ma non lo so.
MountainX

Se l'utente ha assegnato un'azione personalizzata "apri con" al file exten come "html", questo NON aprirà il browser, ma il programma con cui l'utente lo ha collegato .... Questa non è affatto una soluzione!
thesaint

@thesaint Great point; un'alternativa openWebpagepotrebbe utilizzare Runtime.exec(..)e scorrere un insieme predefinito di nomi di browser popolari, passando loro l'URL. Questo ha anche l'avvertenza di non funzionare per gli utenti con browser oscuri, tuttavia, ma lo scriverò e lo aggiungerò a questa risposta presto quando avrò un momento libero.
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) {}

nota: devi includere le importazioni necessarie da 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

So che questa è una vecchia domanda ma a volte Desktop.getDesktop()produce un arresto anomalo inaspettato come in Ubuntu 18.04. Pertanto, devo riscrivere il mio codice in questo modo:

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

Quindi possiamo chiamare questo helper dall'istanza:

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);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.