2016-03-21 2 views
0

Ich versuche, eine CSS-Datei zu meiner JavaFX Appllication aufzunehmen, durch den folgenden Ausschnitt:zum Laden einer Datei von getClass() getResource() fehlschlägt, File() arbeitet

public void loadExternalCSS() { 
     System.out.println("CLASSPATH: "+System.getProperty("java.class.path")); 
     try{ 
     skinCSS = getClass().getResource("css/default_skin.css").toExternalForm(); 
     } 
     catch(Exception e){ 
      System.err.println("Exception: " + e); 
      e.printStackTrace(System.err); 
     } 
} 

Welche Erträge, zur Laufzeit :

java.lang.NullPointerException 
    at 
robotikosanomologitos.RobotikosAnomologitos.loadExternalCSS(RobotikosAnomologitos.java:529) 
    at robotikosanomologitos.RobotikosAnomologitos.start(RobotikosAnomologitos.java:491) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
    at java.lang.Thread.run(Thread.java:745) 

Das seltsame ist, dass ein paar Zeilen über dieser Funktion habe ich eine kleine Funktion, die von einer properties Datei liest.

public void readPropertiesFile() { 
     Properties props = new Properties(); 
     InputStream is; 
     try { 
      File f = new File("properties"); 
      is = new FileInputStream(f); 
     } 
     /* etcetera */ 
} 

Das funktioniert wie ein Charme. Die properties Datei wird an der Wurzel des Projektverzeichnisses, C:\~my_projects_folder~\RobotikosAnomologitos

Nach der Suche um eine Lösung, ich sah, dass getClass().getResource() versucht, eine Ressource in der Classpath zu finden. Ich habe versucht, den Klassenpfad bei jedem Lauf zu drucken, und ich bekomme: RobotikosAnomologitos\dist\run125323585\RobotikosAnomologitos.jar was logisch genug ist.

Nachdem ich in diesem temporären Ordner während der Ausführung des Programms nachgesehen habe, kann ich weder einen css-Ordner noch eine css-Datei finden.

Aber die Datei befindet sich tatsächlich in meinem Arbeitsprojektverzeichnis, unter RobotikosAnomologitos\css\default_skin.css. Aus irgendeinem Grund wird es zur Laufzeit nicht in den Classpath eingefügt, was dazu führt, dass getResource() bei der Suche Null zurückgibt.

Irgendwelche Ideen, wie man es einbaut?


EDIT: habe ich vergessen zu erwähnen, dass ich auch css/default_skin.css unter dem src Paket platziert haben, und zeigt in Netbeans' -Paket Baum (src/css/default_skin.css).

In der gleichen Weise habe ich einige Grafiken, die unter src/graphics/ befinden, die von getClass().getResourceAsStream() in Ordnung geladen werden. Was mich auch verwirrt, warum die CSS-Datei nicht gefunden werden kann. Vielleicht wird es nicht in der jar kompiliert?

+0

Versuchen Sie nicht, Ressourcen im Klassenpfad als Dateien zu verwenden! Dies wird offensichtlich nicht funktionieren. Es gibt keine 'Datei' innerhalb von Gläsern zur Laufzeit. Verwenden Sie Ressourcen. – fge

+0

@DimitrisSfounis Probieren Sie es mit 'getClass(). GetResource ("/css/default_skin.css "). ToExternalForm();' oder 'getClass(). GetClassLoader(). GetResource (" css/default_skin.css ") .toExternalForm(); ' –

+0

@MadhusudanaReddySunnapu Versuchte beide, keine Würfel. –

Antwort

0

Sie müssen css Ordner in classpath hinzufügen, wenn Sie getClass().getResource("css/default_skin.css").toExternalForm();

+0

Wie mache ich das?Warum musste ich dies beim Laden von Grafiken oder der Eigenschaftendatei in meiner Anwendung nicht tun? –

+0

Wenn Sie dies von Eclipse aus ausführen, müssen Sie zu 'properties -> Java build path' gehen und Quellordner hinzufügen. Wenn Sie Ihre Anwendung packen, müssen Sie den Ordner css angeben, der in die JAR-Datei gemäß der Spezifikation des Paketierungswerkzeugs aufgenommen werden soll. –

+0

Ich habe vergessen zu erwähnen, dass sich der Ordner 'css/default_skin.css' unter dem' src'-Paket befindet. Auf die gleiche Weise sind 'Grafiken', die auch von' getClass() geladen werden. GetResourceAsStream() ' –

1

mit wollen abrufen Wenn Sie getResource() für eine Klasse nennen und sie voranstellen kein /, wird der Pfad zu dem Paket zu sein, relativ betrachtet der Klasse.

Wenn Sie richtig um die Ressourcen zu dem Classpath hinzugefügt haben, sollte diese Arbeit:

skinCSS = getClass().getResource("/css/default_skin.css").toExternalForm(); 
+0

Funktioniert nicht, das bedeutet, dass ich die CSS-Datei wahrscheinlich nicht korrekt zum Klassenpfad hinzugefügt habe. –

+0

@DimitrisSfounis: Überprüfen Sie einfach den Ordner 'build' oder das Glas unter' dist' in der Ansicht 'Files'. Dadurch sollten Sie überprüfen können, ob die Dateien vorhanden sind oder nicht. – fabian

+0

CSS-Datei ist dort unter 'build/classes/css/default_skin.css'. –

0

Überprüfen Sie, ob Sie nicht mit binär kodieren von CSS-Dateien (siehe Projekteigenschaften> Verpackung). Wenn Sie verwenden, sollte die genannte Dateierweiterung ".bss" sein.

+0

"Binär Enable JavaFX CSS-Dateien" ist angekreuzt. –

+0

Also versuchen Sie folgendes: 'skinCSS = getClass(). GetResource (" css/default_skin.bss "). ToExternalFor m();' –

Verwandte Themen