【问题标题】:Desktop class in JavaFXJavaFX 中的桌面类
【发布时间】:2014-09-02 11:38:32
【问题描述】:

我正在尝试将 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();
                }
            });

浏览器打开器:

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") 它工作正常。

你们有什么想法吗?

谢谢。

【问题讨论】:

  • 您能否记录newValue 字符串,并发布一些由Windows 文件管理器打开的值的示例?
  • 我已经调试过了。 newValue 包含与常量完全相同的值。我还插入了一个 newValue.equals(constant) 和它的 true。

标签: java javafx awt javafx-8


【解决方案1】:

我不知道为什么 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 的 ApplicationgetHostServices() 方法中获取 HostServices

【讨论】:

  • 我不能 100% 确定,但我认为只有在运行嵌入在网页 (Applet) 中的 JavaFX 应用程序时才能使用 HostServices。
  • 我试过了,同样的问题出现了。即使我尝试将我的 Java 从 8u20 降级到 8u11,因为我在关闭 JavaFX 应用程序时遇到了管道问题。 (可能是一个错误,因为它现在似乎没有出现)
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 2016-04-19
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 2013-05-17
  • 2016-05-03
相关资源
最近更新 更多