JavaFX中的桌面类

时间:2014-09-02 11:38:33

标签: java javafx awt javafx-8

我正在尝试将JavaFX WebView集成到我的应用程序中。

问题是我想在默认浏览器中打开链接而不是在WebView中打开链接。

我google了很多,每个人都在谈论桌面类,所以我试了一下。

以下是我的相关代码:

webView.getEngine().locationProperty()
            .addListener(new ChangeListener<String>() {

                @Override
                public void changed(
                        ObservableValue<? extends String> observable,
                        String oldValue, String newValue) {
                    Platform.runLater(() -> webView.getEngine().loadContent(content.get()));
                    new Thread() {
                        @Override
                        public void run() {
                            BrowserOpener.open(newValue);
                        }
                    }.start();
                }
            });

然而,它似乎有效,但有一个问题。 webView.getEngine()。locationProperty()                 .addListener(new ChangeListener(){

                @Override
                public void changed(
                        ObservableValue<? extends String> observable,
                        String oldValue, String newValue) {
                    Platform.runLater(() -> webView.getEngine()
                            .loadContent(content.get()));
                    new Thread() {
                        @Override
                        public void run() {
                            BrowserOpener.open(newValue);
                        }
                    }.start();
                }
            });

BrowserOpener:

public static void open(String uriString) {
    openUri(URI.create(uriString));
}
public static void openUri(URI uri) {
    if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
        try {
            desktop.browse(uri);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

然而,它似乎有效,但有一个问题。如果我运行此应用程序并单击链接,默认浏览器将打开链接,但问题出在此处。 Windows文件管理器也在打开。

如果我将BrowserOpener.open(newValue)更改为BrowserOpener.open("http://google.com")它的工作正常。

你们有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:2)

我不知道为什么它与java.awt.Desktop#browse(URI)的行为方式相同,但我发现有一个使用HostServices类的原生JavaFX解决方案。既然您正在使用JavaFX,那么无论如何它可能是一个更好的主意。这是我刚试过的一个例子:

import javafx.application.Application;
import javafx.application.HostServices;
import javafx.stage.Stage;

public class BrowseTest extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage arg0) throws Exception {
        HostServices host = getHostServices();
        host.showDocument("http://google.com");
    }
}

请注意,据我所知,您只能从JavaFX HostServices Application方法获取getHostServices()