2015-03-17 4 views
7

Я создал приложение JavaFX, развернул файл .app и отлично работает. Затем я устанавливаю оперативную систему для открытия всех файлов с определенным расширением с моим приложением. Моя проблема в том, что когда я дважды щелкаю по файлу, я открываю свое приложение, но я не знаю, какой файл его открыл.Передача параметров в приложение JavaFx путем двойного щелчка по файлу

Я попытался проверить параметры приложения с помощью функции getParameters().getRaw(), но он всегда возвращает пустой список.

Кто-нибудь знает, как получить путь к файлу, открывающему приложение?

+0

Что дает 'getParameters(). GetRaw()' give? –

+0

Извините, что я действительно использовал его, я отредактирую свой вопрос – u09

ответ

4

Наконец-то я нашел способ решить эту проблему.

Чтобы ответить на этот вопрос я создал 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.

2

У меня была такая же проблема на OS X довольно долгое время, и принятый ответ не сработал для меня. После большого Googling я наконец нашел решение на http://permalink.gmane.org/gmane.comp.java.openjdk.openjfx.devel/10370.

Таким образом, мне нужно было использовать API com.sun, чтобы заставить его работать. Я включил некоторые примеры код ниже:

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 для своего приложения), поэтому извиняюсь за любые синтаксические ошибки в коде.

+0

Возможно, вы захотите использовать https://github.com/bitgamma/fx-platform-utils, который решает эти проблемы. –