【发布时间】:2013-05-12 08:15:47
【问题描述】:
我正在尝试从 javafx 在默认系统浏览器中打开一个 web url。我没有找到任何有关此的官方文档。有什么线索吗?
编辑: 我找到了a tutorial,但它不起作用。 我正在使用 MacOsX,我尝试启动
java.awt.Desktop.getDesktop().browse(new URI(url));
但我收到了HeadlessExcelption
【问题讨论】:
我正在尝试从 javafx 在默认系统浏览器中打开一个 web url。我没有找到任何有关此的官方文档。有什么线索吗?
编辑: 我找到了a tutorial,但它不起作用。 我正在使用 MacOsX,我尝试启动
java.awt.Desktop.getDesktop().browse(new URI(url));
但我收到了HeadlessExcelption
【问题讨论】:
似乎无法完成,因为此功能未实现:https://javafx-jira.kenai.com/browse/RT-210
问题是您将无法启动任何东西,这需要 awt-stack 和 jfx 在同一个 VM 中。决定 - 是使用单独的 JVM。只需启动一个单独的 VM,并接受通过套接字浏览的命令。
这是一种方式,另一种方式 - 是从 java 中找到任何其他方式的浏览器调用 - 这不是 javafx-2 特有的任务,而是 java 特有的任务。
但是开发者已经添加了评论:
Anthony Petrov 添加了评论 - 2013 年 5 月 17 日 05:09 PM 请注意,FX8 允许 headful AWT 与 FX 在同一 VM 中运行。所以 AWT API 应该可以工作。
【讨论】:
使用hostServices.showDocument(location)。
尝试将以下代码放在应用程序的启动方法中:
getHostServices().showDocument("http://www.yahoo.com");
【讨论】:
fxml controllers classes 有按钮,需要在某些网站上打开默认浏览器,我该怎么办:)?
getHostServices() 的 Application 子类。如果您不想使用静态方法并且希望您的 FXML 控制器在多个应用程序中使用(例如,它们是独立于任何应用程序的库控件),那么您需要传递 application instance into the FXML controllers。
java.lang.Exception: No web browser found:/
补充 Jewelsea 的答案,如果您不知道如何调用 getHostServices(),请在您的主课程中尝试:
HostServicesDelegate hostServices = HostServicesFactory.getInstance(this);
hostServices.showDocument(WEBSITE);
【讨论】:
另一种选择是使用ProcessBuilder:
public static void openWebpage(String url) {
try {
new ProcessBuilder("x-www-browser", url).start();
} catch (IOException e) {
e.printStackTrace();
}
}
如果Desktop.getDesktop().browse(uri) 因某种原因挂起而没有任何错误,您可以使用此选项。
【讨论】:
这是一个在场景控制器中运行的脚本,当一个按钮被激活时:
package sample;
import com.sun.deploy.uitoolkit.impl.fx.HostServicesFactory;
import com.sun.javafx.application.HostServicesDelegate;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.stage.Stage;
public class Controller extends Application {
public void openBrowser(ActionEvent actionEvent) throws Exception {
HostServicesDelegate hostServices = HostServicesFactory.getInstance(this);
getHostServices().showDocument("http://www.yahoo.com");
}
@Override
public void start(Stage primaryStage) throws Exception {
}
}
【讨论】:
试试这个:
try {
Desktop.getDesktop().browse(new URL("https://google.com").toURI());
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
【讨论】: