Mở một liên kết trong trình duyệt bằng nút java? [bản sao]


103

Làm cách nào tôi có thể mở một liên kết trong trình duyệt mặc định bằng một lần nhấp vào nút, dọc theo các dòng

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

?


2
Bạn có thể đã thử xem JavaDocs cho lớp được sử dụng trong câu trả lời được chấp nhận cho câu hỏi cuối cùng của bạn ! Những tài liệu đó. rất tiện dụng, đính kèm chúng với IDE của bạn hoặc đánh dấu phiên bản trực tuyến.
Andrew Thompson

Câu hỏi trùng lặp: stackoverflow.com/q/5226212/873282
koppor

Câu trả lời:


223

Sử dụng phương pháp duyệt # Desktop (URI) . Nó mở một URI trong trình duyệt mặc định của người dùng.

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

điều này dường như không hoạt động trong các tệp JAR được tạo bởi Netbeans 7.x. Nó hoạt động khi mã được chạy từ Netbeans, nhưng không hoạt động khi được triển khai dưới dạng tệp JAR ... ít nhất là theo kinh nghiệm của tôi. Tôi vẫn đang tìm giải pháp.
MountainX

@MountainX Gỡ lỗi và xác minh rằng máy tính để bàn được hỗ trợ và việc triển khai bảo mật không hạn chế bạn truy cập phiên bản máy tính để bàn. Nếu bạn đang chạy JAR dưới dạng một applet, khả năng bảo mật là thủ phạm.
FThompson

@ Vulcan - Tôi không chạy JAR dưới dạng một applet. Tôi không biết về bất kỳ cài đặt bảo mật nào có thể ngăn điều này hoạt động. Tôi đã "làm việc xung quanh" nó bằng cách gọi điện new ProcessBuilder("x-www-browser", uri.toString());. Bạn sẽ nghĩ rằng nếu có các giới hạn bảo mật, lệnh gọi ProcessBuilder sẽ không hoạt động. Nhưng nó hoạt động. Tôi không biết tại sao desktop.browse(uri)nó không hoạt động, nhưng tôi đã thấy rằng nó không hiệu quả với rất nhiều người. Tôi đoán có thể đó là sự cố của Netbeans, nhưng tôi không biết.
MountainX

Nếu người dùng đã chỉ định hành động tùy chỉnh "mở bằng" cho tệp xuất hiện như "html" thì hành động này sẽ KHÔNG mở trình duyệt, nhưng chương trình mà người dùng đã liên kết với .... Đây không phải là một giải pháp!
thesaint

@thesaint Điểm tuyệt vời; một giải pháp thay thế openWebpagecó thể sử dụng Runtime.exec(..)và lặp lại qua một tập hợp các tên trình duyệt phổ biến được xác định trước, chuyển chúng qua URL. Tuy nhiên, điều đó cũng có cảnh báo trước là không chạy cho người dùng có trình duyệt khó hiểu, nhưng tôi sẽ sớm viết và thêm nó vào câu trả lời này khi tôi có thời gian rảnh.
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) {}

lưu ý: bạn phải bao gồm các nhập khẩu cần thiết từ 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

Tôi biết rằng đây là một câu hỏi cũ nhưng đôi khi nó Desktop.getDesktop()tạo ra sự cố không mong muốn như trong Ubuntu 18.04. Do đó, tôi phải viết lại mã của mình như sau:

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

Sau đó, chúng ta có thể gọi trình trợ giúp này từ ví dụ:

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);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.