2015-03-17 10 views
7

Ho creato un'applicazione JavaFX, ho distribuito il file .app e funziona correttamente. Quindi ho impostato il sistema operativo per aprire tutti i file con un'estensione specifica con la mia applicazione. Il mio problema è che quando faccio doppio clic su un file apro la mia applicazione, ma non so quale sia il file che l'ha aperta.Passare i parametri all'applicazione JavaFx facendo doppio clic sul file

Ho provato a verificare i parametri dell'applicazione con la funzione getParameters().getRaw() ma restituisce sempre una lista vuota.

Qualcuno sa come recuperare il percorso del file che ha aperto l'applicazione?

+0

Cosa significa 'getParameters(). GetRaw()' restituisce? –

+0

Scusa se stavo effettivamente usando quello, modifico la mia domanda – u09

risposta

4

Ho finalmente trovato un modo per risolvere questo.

Per rispondere a questa ho creato un'applicazione di esempio che è composto da tre classi:

Launcher 
MyApp 
Handler_OpenFile 

MyApp è la classe estende la classe javafx.application.Application, il Handler_OpenFile viene utilizzato per gestire l'evento doppio clic e infine il Launcher è quello contenente il main.

Launcher.java: questa classe DEVE esistere perché se il main è stato definito all'interno della classe che estende javafx.application.Application OpenFilesEvent non funzionerà correttamente (più precisamente OpenFilesEvent verrà generato solo se l'applicazione era già ha aperto).

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: questa classe definisce una variabile statica che memorizza il valore del file che ha aperto l'applicazione. Questa non è probabilmente la soluzione migliore, ma è l'unico modo per farlo funzionare per ora.

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: questa classe sarà in grado di accedere al valore statico assegnato nella classe Handler_OpenFile e recuperare percorso assoluto del file di apertura.

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(); 
     } 
    } 
} 

finalmente nel file build.xml che crea il tuo pacchetto si dovrà aggiungere l'associazione di file (in questo esempio con i file con estensione .zzz):

<fx:info title="Sample" vendor="me"> 
    <fx:association extension="zzz" description="Sample Source"/> 
</fx:info> 

questo funziona solo con l'ultimo aggiornamento di Java (8u40): documentation at this link. Per le versioni precedenti dovrai modificare manualmente info.plist all'interno del tuo pacchetto come si dice nello Apple Java Extensions documentation.

2

Ho avuto lo stesso problema su OS X da un po 'di tempo e la risposta accettata non ha funzionato per me. Dopo aver cercato su Google, ho finalmente trovato una soluzione al http://permalink.gmane.org/gmane.comp.java.openjdk.openjfx.devel/10370.

In sintesi, avevo bisogno di utilizzare l'API com.sun per farlo funzionare. Ho incluso alcuni esempi di codice di seguito:

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 
} 

Questo dovrebbe essere considerato una soluzione temporanea fino a API appropriate vengono implementate per gestire l'apertura del file. Speriamo che questa risposta aiuti qualcuno che non riesce a far funzionare la risposta accettata.

Nota: Java non è un linguaggio che uso spesso (utilizzo Scala e ScalaFX per la mia applicazione), quindi mi scuso per eventuali errori di sintassi nel codice.

+0

Potresti voler usare https://github.com/bitgamma/fx-platform-utils che risolve questi problemi. –