2016-07-19 5 views
0

Da ich die Struktur meiner Java-Quellpakete geändert habe, möchten einige der Funktionen zum Öffnen von Dateien nicht mehr funktionieren. Ich habe einige Ressourcen (Symbol, Eigenschaftendateien usw.) von MyProject\res\ zu MyProject\src\res\ verschoben.Die im Quellpaketbaum gespeicherte Datei kann nicht geöffnet werden

Ich denke, ich sollte this.getClass().getResourceAsStream("icon.png") statt Dateipfad Zeichenfolge verwenden, aber ich bin mir nicht sicher.

Hier ist, wie ich auf die Icon-Datei zuzugreifen, bevor ich die Ressourcen Standort ändern:

private final static String iconSourcePath = "file:res/icon/icon.png"; 

primaryStage.getIcons().add(new Image(iconSourcePath)); 

Gibt es eine Regel für den Zugriff auf Dateien in Java? Wenn sich die angeforderte Datei in der Quelldatei oder außerhalb befindet?

Edit: Dies ist die Lösung, die ich gefunden habe.

Ich fand den einfachsten Weg, immer absolute Pfade zu setzen, relativ zum Ordner src.

Zum Beispiel in meinem Projekt habe ich diese Ordner-Hierarchie:

src 

    META-INF 
    MANIFEST.MF 

    res 
    icon 
     icon.png 
    lang 
     MessageBundle 
     MessageBundle_en.properties 
     MessageBundle_fr.properties 
    pref 
     AppProperties 
     Properties.properties 

    simulation 
    log 
     Console.java 
    views 
     settingsWindows 
     settingsWindows.fxml 
     SettingsWindows_Controller.java 
     simulation 
     simulation.fxml 
     Simulation_Controller.java 
     toolBar 
     toolBar.fxml 
     ToolBar_Controller.java 
    Simulation.java 

    Main.java 

Wenn ich die icon.png in der hinzufügen müssen SettingsWindows_Controller.java (in JavaFX), werde ich dies tun, wie folgt aus:

private final static String iconSourcePath = "/res/icon/icon.png"; 

stage.getIcons().add(new Image(iconSourcePath)); 

Und wenn ich die toolBar.fxml in jeder Datei geladen werden soll, werde ich das tun:

private final static String fxmlSourcePathToolBar = "/simulation/views/toolBar/toolBar.fxml"; 

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(fxmlSourcePathToolBar)); 

Mit dieser Methode funktioniert es im Debug-Modus (in der IDE) UND in der JAR-Datei.

Antwort

0

Besser sollten Sie getResourceAsStream Funktion verwenden, um aktuelle Klassenposition zu erhalten. Zum Beispiel:

ImageFactory.class.getResourceAsStream("image.png"); 

Above Code lädt Bild in dem Ordner, in dem Klasse imagefactory vorhanden ist, wenn Sie Ihre Bilder in verschiedenen Ordnern sind, verwenden Sie dann .. und/Betreiber zum vorherigen Ordner gehen und untergeordnete Ordner zu erhalten sind.

+0

Kann ein absoluter Pfad vom Root-Paket verwendet werden? Wie 'src/res/...', ohne die '../'? –

+0

@ArmandDelessert: 'System.getProperty (" user.dir ")' hilft Ihnen, den Pfad für das aktuelle Projekt zu verlassen. nur ein Ordner hinter Ihrem Root-Paket. –

+0

Es funktioniert nicht. Ich versuche mit 'getClass(). GetResource (fxmlSourceName)', eine gültige URL zu erhalten, aber es gibt immer 'null' zurück, wenn ich die JAR-Datei ausführe. Im Debug-Modus funktioniert es gut ... Ich verstehe nicht die Logik hinter dem Dateipfad/Name-Mechanismus. –