2017-09-28 3 views
1

Ich habe eine JavaFX-Anwendung mit einer Schaltfläche, die ich eine "Hilfedatei" öffnen möchte, die ich bereits geschrieben habe, und ich möchte, dass es im Standardtext-Editor geöffnet wird, wenn der Benutzer die Schaltfläche drückt. Diese Datei befindet sich im Paket mit der FX-Hauptklasse, dem Controller und der FXML-Datei. Ich habe versucht, ein paar verschiedene Dinge zu tun, um die Datei zu öffnen, aber keiner von ihnen hat funktioniert. Hier ist die Methode, die ich momentan habe, die mir scheint, dass es funktionieren sollte, aber es ist nicht. Was mache ich falsch? Der Name des Pakets, in dem alles enthalten ist, wird nur zur Verdeutlichung "nutritionfx" genannt, und dieser Code ist eine Methode innerhalb des Controllers.Wie öffne ich eine Textdatei aus dem Paket, während die Anwendung läuft?

//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

Wrapping einer Ressource URI in einer 'Datei' macht es nicht zu einer Datei. Wenn sich die Ressourcendatei in einem Jar befindet und der Editor eine Datei erwartet, erhält sie keinen Zugriff auf die Datei. Der einzige Ansatz, den ich kenne, um die Ressource als Datei zugänglich zu machen, wäre das Kopieren des Inhalts der Ressource in eine Datei ... – fabian

+0

Also wäre es am besten, einfach eine neue Datei aus der gepackten Datei zu erstellen, dann öffne diese Datei? Wird das eine neue Datei auf dem Computer des Benutzers erstellen? – Trace

+1

Ja, genau, mach das Trace. – jewelsea

Antwort

2

Hier ist ein Beispiel-App, die die von Ihnen vorgeschlagene Lösung Trace zeigt.

eine neue Datei aus der verpackten Datei erstellen, öffnen Sie dann die Datei

Die Probe App-Daten aus einer Ressource verpackt mit Ihrer Anwendung gelesen wird und dass in einem Anwendungsverzeichnis in einer lokalen Datei speichern (namens `.FileEditor) im Home-Verzeichnis des Benutzers. Der Benutzer kann den Text in einem Texteditor bearbeiten und den geänderten Text in der lokalen Datei speichern. Wenn sie das nächste Mal die Anwendung ausführen, liest und verwendet sie den geänderten Text und nicht den Text aus der verpackten Ressource.

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

Probenquelle Ressource xyzzy.txt, in demselben Verzeichnis wie der Code FileEditor.java gelegt und auf die Ressource und Ausgabeverpackung Verzeichnis durch das Bausystem kopiert:

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

foobar

Dieses Beispiel verwendet ein TextArea innerhalb der JavaFX-Anwendung, um die Datei zu bearbeiten, aber Sie können genauso einfach im Standard-Systemtext-Editor mit dem folgenden Aufbau öffnen:

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