2017-09-28 14 views
1

J'ai une application JavaFX avec un bouton que je veux ouvrir un "fichier d'aide" que j'ai déjà écrit, et je veux qu'il s'ouvre dans l'éditeur de texte par défaut lorsque l'utilisateur appuie sur le bouton. Ce fichier se trouve dans le package avec la classe FX principale, le contrôleur et le fichier FXML. J'ai essayé de faire quelques choses différentes pour ouvrir le fichier mais aucun d'entre eux n'a fonctionné. Voici la méthode que j'ai actuellement qui me semble que cela devrait fonctionner, mais ce n'est pas le cas. Qu'est-ce que je fais mal? Le nom du paquet tout est à l'intérieur de est nommé "nutritionfx" juste pour la clarification, et ce code est une méthode dans le contrôleur.Comment ouvrir un fichier texte à partir d'un paquet pendant que l'application est en cours d'exécution?

//method to open help file when help button is pressed 
@FXML private void handleHelpButton(ActionEvent event) throws IOException, URISyntaxException { 
    URL url = this.getClass().getResource("/nutritionfx/help.txt"); 
    File file = new File(url.toURI()); 
    Desktop.getDesktop().edit(file); 
} 
+2

Envelopper une ressource uri dans un fichier ne la transforme pas en fichier. Si le fichier de ressources est dans un fichier jar et que l'éditeur attend un fichier, il n'aura pas accès au fichier. La seule approche que je connaisse pour rendre la ressource accessible en tant que fichier serait de copier le contenu de la ressource dans un fichier ... – fabian

+0

Alors, serait-il préférable de simplement créer un nouveau fichier à partir du fichier, puis ouvrir ce fichier? Est-ce que cela créera un nouveau fichier sur l'ordinateur des utilisateurs? – Trace

+1

Oui, exactement, faites ce Trace. – jewelsea

Répondre

2

Voici un exemple d'application qui illustre la solution que vous avez proposée Trace.

créer un nouveau fichier à partir du fichier compressé, puis ouvrez ce fichier

L'exemple d'application va lire les données d'une ressource fournie avec votre application et enregistrez que dans un fichier local dans un répertoire d'applications (nommé `.FileEditor), dans le répertoire personnel de l'utilisateur. L'utilisateur peut modifier le texte dans un éditeur de texte et enregistrer le texte modifié dans le fichier local. La prochaine fois qu'ils exécuteront l'application, ils liront et utiliseront le texte modifié plutôt que le texte de la ressource empaquetée.

import javafx.application.Application; 

import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.stream.Collectors; 

public class FileEditor extends Application { 

    private static final Path USER_FILE_PATH = Paths.get(
     System.getProperty("user.home"), 
     ".FileEditor" 
    ); 

    private static final String SOURCE_FILE_NAME = "xyzzy.txt"; 

    @Override 
    public void start(Stage stage) throws Exception { 
     if (!Files.isDirectory(USER_FILE_PATH)) { 
      Files.createDirectory(USER_FILE_PATH); 
     } 

     Path editableFilePath = Paths.get(USER_FILE_PATH.toString(), SOURCE_FILE_NAME); 
     if (!Files.exists(editableFilePath)) { 
      Files.copy(
       FileEditor.class.getResourceAsStream(SOURCE_FILE_NAME), 
       editableFilePath 
      ); 
     } 

     String text = Files.readAllLines(
       editableFilePath 
     ).stream() 
       .collect(Collectors.joining("\n")); 

     TextArea textArea = new TextArea(text); 

     MenuItem save = new MenuItem("Save..."); 
     save.setOnAction(event -> { 
      try { 
       Files.write(editableFilePath, textArea.getText().getBytes()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     }); 
     MenuItem exit = new MenuItem("Exit"); 
     exit.setOnAction(event -> stage.hide()); 
     MenuBar menuBar = new MenuBar(
       new Menu("File", null, save, exit) 
     ); 

     BorderPane layout = new BorderPane(); 
     layout.setTop(menuBar); 
     layout.setCenter(textArea); 

     Scene scene = new Scene(layout); 
     stage.setScene(scene); 
     stage.show(); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 

ressource source d'exemple xyzzy.txt, placé dans le même répertoire que le code FileEditor.java et copié à la sortie des ressources et le répertoire d'emballage par le système de construction:

You are in a maze of twisty passages, all alike. 
xyzzy 
You are inside the building. 

foobar

Cette sample utilise un TextArea dans l'application JavaFX pour éditer le fichier, mais vous pouvez tout aussi facilement ouvrir dans l'éditeur de texte système par défaut en utilisant la construction:

getHostServices().showDocument(
    editableFilePath.toUri().toURL().toExternalForm() 
);