通过双击文件将参数传递给 JavaFx 应用程序
Posted
技术标签:
【中文标题】通过双击文件将参数传递给 JavaFx 应用程序【英文标题】:Pass Parameters to JavaFx Application by double-click on file 【发布时间】:2015-03-17 14:17:33 【问题描述】:我创建了一个 JavaFX 应用程序,部署了 .app 文件,它运行良好。然后,我将操作系统设置为使用我的应用程序打开所有具有特定扩展名的文件。我的问题是,当我双击一个文件时,我会打开我的应用程序,但我不知道打开它的文件是哪个文件。
我尝试使用函数getParameters().getRaw()
检查应用程序参数,但它总是返回一个空列表。
有人知道如何检索打开应用程序的文件的路径吗?
【问题讨论】:
getParameters().getRaw()
给了什么?
对不起,我实际上正在使用那个,我将编辑我的问题
【参考方案1】:
我终于找到了解决这个问题的方法。
为了回答这个问题,我创建了一个由三个类组成的示例应用程序:
Launcher
MyApp
Handler_OpenFile
MyApp是javafx.application.Application类的扩展类,Handler_OpenFile用来处理双击事件,最后Launcher是包含main的那个。
Launcher.java:这个类必须存在,因为如果 main 是在扩展 javafx.application.Application 的类中定义的,那么 OpenFilesEvent 将无法正常工作(更准确地说,只有在应用程序已经打开时才会触发 OpenFilesEvent )。
public class Launcher
public static void main(String[] args)
if (System.getProperty("os.name").contains("OS X"))
com.apple.eawt.Application a = com.apple.eawt.Application.getApplication();
Handler_OpenFile h_open = new Handler_OpenFile();
a.setOpenFileHandler(h_open);
Application.launch(Main.class, args);
Handler_OpenFile.java:该类定义了一个静态变量,用于存储打开应用程序的文件的值。这可能不是最好的解决方案,但这是我现在可以使它工作的唯一方法。
public class Handler_OpenFile implements OpenFilesHandler
public static File file = null;
@Override
public void openFiles(OpenFilesEvent e)
for (File file : e.getFiles())
this.file = file;
MyApp.java:该类将能够访问分配给 Handler_OpenFile 类的静态值并检索打开文件的绝对路径。
public class MyApp extends Application
@Override
public void start(Stage primaryStage)
Logger logger = Logger.getLogger("log");
FileHandler fh;
try
// This block configure the logger with handler and formatter
fh = new FileHandler("../Logfile.log");
logger.addHandler(fh);
SimpleFormatter formatter = new SimpleFormatter();
fh.setFormatter(formatter);
// the following statement is used to log any messages
logger.info("Application launched from: " + Handler_OpenFile.file.getAbsolutePath());
catch (SecurityException | IOException exception)
exception.printStackTrace();
try
BorderPane root = new BorderPane();
Scene scene = new Scene(root,400,400);
primaryStage.setScene(scene);
primaryStage.show();
catch(Exception e)
e.printStackTrace();
最后,在创建你的包的 build.xml 文件中,你必须添加文件关联(在这个例子中,文件扩展名为 .zzz):
<fx:info title="Sample" vendor="me">
<fx:association extension="zzz" description="Sample Source"/>
</fx:info>
这仅适用于 Java(8u40) 的最新更新:documentation at this link。对于以前的版本,您必须像 Apple Java Extensions documentation 中所说的那样在您的包中手动更改 info.plist。
【讨论】:
近 5 年后,这仍然是要走的路。对此赞不绝口!将com.apple.eawt
类替换为 java.awt.desktop
等效项。【参考方案2】:
我在 OS X 上遇到同样的问题已经有一段时间了,接受的答案对我不起作用。经过一番谷歌搜索,我终于在http://permalink.gmane.org/gmane.comp.java.openjdk.openjfx.devel/10370找到了解决方案。
总之,我需要使用com.sun
API 才能让它工作。我在下面包含了一些示例代码:
public class MyApp extends Application
public MyApp()
com.sun.glass.ui.Application glassApp = com.sun.glass.ui.Application.GetApplication();
glassApp.setEventHandler(new com.sun.glass.ui.Application.EventHandler()
@Override
public void handleOpenFilesAction(com.sun.glass.ui.Application app, long time, String[] filenames)
super.handleOpenFilesAction(app, time, filenames);
// Do what ever you need to open your files here
);
// Standard JavaFX initialisation follows
在实施适当的 API 来处理文件打开之前,这应该被视为临时解决方案。希望这个答案可以帮助那些无法获得公认答案的人。
注意:Java 不是我经常使用的语言(我的应用程序使用 Scala 和 ScalaFX),因此对于代码中的任何语法错误,我深表歉意。
【讨论】:
您可能想使用github.com/bitgamma/fx-platform-utils 来解决这些问题。以上是关于通过双击文件将参数传递给 JavaFx 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何通过asp.net schtasks将参数传递给bat文件