双击文件将参数传递给JavaFx Application

时间:2015-03-17 14:17:33

标签: macos javafx

我创建了一个JavaFX应用程序,部署了.app文件,它运行正常。然后我设置操作系统打开所有带有我的应用程序的特定扩展名的文件。我的问题是,当我双击某个文件时,我会打开我的应用程序,但我不知道打开它的文件是哪个。

我尝试使用函数getParameters().getRaw()检查应用程序参数,但它总是返回一个空列表。

有人知道如何检索打开应用程序的文件的路径吗?

2 个答案:

答案 0 :(得分:6)

我终于找到了解决这个问题的方法。

为了回答这个问题,我创建了一个由三个类组成的示例应用程序:

Launcher
MyApp
Handler_OpenFile

MyApp是扩展javafx.application.Application类的类,Handler_OpenFile用于处理双击事件,最后Launcher是包含main的事件。

Launcher.java:这个类必须存在,因为如果在扩展javafx.application.Application的类中定义了main,则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:此类定义一个静态变量,用于存储打开应用程序的File的值。这可能不是最好的解决方案,但它是我现在能够使它工作的唯一方法。

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。对于以前的版本,您必须在包中手动更改info.plist,如Apple Java Extensions documentation中所述。

答案 1 :(得分: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),所以我为代码中的任何语法错误道歉。