我找到了一种使用HostServices在默认浏览器上打开链接的方法。
getHostServices().showDocument("http://www.google.com");
答案 0 :(得分:4)
一般来说,您可以使用Desktop#open(file)
打开原生文件作为下一个文件:
final Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
if (desktop != null && desktop.isSupported(Desktop.Action.OPEN)) {
desktop.open(file);
} else {
throw new UnsupportedOperationException("Open action not supported");
}
启动关联应用程序以打开该文件。如果指定的话 file是一个目录,当前平台的文件管理器是 推出它来打开它。
更具体地说,如果是浏览器,您可以直接使用Desktop#browse(uri)
,如下所示:
final Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null;
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
desktop.browse(uri);
} else {
throw new UnsupportedOperationException("Browse action not supported");
}
启动默认浏览器以显示
URI
。如果是默认浏览器 无法处理已注册的应用程序的指定URI
用于处理指定类型的URIs
。申请是 根据{{1}}的协议和路径确定,由...定义URI
课程。如果调用线程没有必要 权限,这是从applet中调用的, 使用URI
。同样,如果调用的话 没有必要的权限,这是从一个内部调用的 Java Web Started应用程序,AppletContext.showDocument()
被使用。
答案 1 :(得分:2)
如果要在浏览器中打开具有http:
方案的URL,或者使用该文件类型的默认应用程序打开文件,则引用的HostServices.showDocument(...)
方法提供“纯JavaFX“这样做的方式。请注意,您无法使用此功能(据我所知)从Web服务器下载文件并使用默认应用程序打开它。
要使用默认应用程序打开文件,您必须将文件转换为file:
URL的字符串表示形式。这是一个简单的例子:
import java.io.File;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
public class OpenResourceNatively extends Application {
@Override
public void start(Stage primaryStage) {
TextField textField = new TextField("http://stackoverflow.com/questions/39898704");
Button openURLButton = new Button("Open URL");
EventHandler<ActionEvent> handler = e -> open(textField.getText());
textField.setOnAction(handler);
openURLButton.setOnAction(handler);
FileChooser fileChooser = new FileChooser();
Button openFileButton = new Button("Open File...");
openFileButton.setOnAction(e -> {
File file = fileChooser.showOpenDialog(primaryStage);
if (file != null) {
open(file.toURI().toString());
}
});
VBox root = new VBox(5,
new HBox(new Label("URL:"), textField, openURLButton),
new HBox(openFileButton)
);
root.setPadding(new Insets(20));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
private void open(String resource) {
getHostServices().showDocument(resource);
}
public static void main(String[] args) {
launch(args);
}
}
答案 2 :(得分:1)
只有java.awt.Desktop
的解决方案才能让我从JavaFX打开文件。
然而,起初,我的应用程序卡住了,我必须弄清楚是否有必要从新线程调用Desktop#open(File file)
。从当前线程或JavaFX应用程序线程Platform#runLater(Runnable runnable)
调用该方法导致应用程序无限期挂起而不会抛出异常。
这是一个小型示例JavaFX应用程序,其中包含工作文件开放解决方案:
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
public class FileOpenDemo extends Application {
@Override
public void start(Stage primaryStage) {
final Button button = new Button("Open file");
button.setOnAction(event -> {
final FileChooser fileChooser = new FileChooser();
final File file = fileChooser.showOpenDialog(primaryStage.getOwner());
if (file == null)
return;
System.out.println("File selected: " + file.getName());
if (!Desktop.isDesktopSupported()) {
System.out.println("Desktop not supported");
return;
}
if (!Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) {
System.out.println("File opening not supported");
return;
}
final Task<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
try {
Desktop.getDesktop().open(file);
} catch (IOException e) {
System.err.println(e.toString());
}
return null;
}
};
final Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();
});
primaryStage.setScene(new Scene(button));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
使用javafx.application.HostServices
的其他建议解决方案根本不起作用。我在Ubuntu 17.10 amd64上使用OpenJFX 8u141,并在调用HostServices#showDocument(String uri)
时遇到以下异常:
java.lang.ClassNotFoundException: com.sun.deploy.uitoolkit.impl.fx.HostServicesFactory
显然,JavaFX HostServices尚未在所有平台上正确实现。关于此主题,另请参阅:https://github.com/Qabel/qabel-desktop/issues/420