Наконец-то я нашел способ решить эту проблему.
Чтобы ответить на этот вопрос я создал Sample приложения, которое состоит из трех классов:
Launcher
MyApp
Handler_OpenFile
MyApp класс расширив класс javafx.application.Application, то Handler_OpenFile используется для обработки двойного щелчка мышью события и, наконец, Launcher - это тот, который содержит основную часть.
Launcher.java: этот класс ДОЛЖЕН существовать, потому что если основной был определен внутри класса, который расширяет 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. Для предыдущих версий вам нужно будет вручную изменить файл info.plist внутри вашего пакета, как указано в Apple Java Extensions documentation.
Что дает 'getParameters(). GetRaw()' give? –
Извините, что я действительно использовал его, я отредактирую свой вопрос – u09