2016-05-06 10 views
0

相対パスの起点の場所はどこに記載されていませんgetStylesheets() javadoc。部分的には"JavaFX CSS Reference Guide"に記載されていますが、説明は議論の余地があります。シーン#getStylesheets()の相対パスのパス起点とは何ですか?

例えば言われている。

スタイルシートURLは、絶対URLまたは相対URLであってもよいです。 の相対URLが指定された場合、具体的なApplicationクラスの ClassLoaderのベースURLに対して解決されます。たとえば、 がメインクラスのcom.wicked.cool.ui.MainでApplicationを拡張している場合、 という相対URL "/com/wicked/cool/resources/styles.css"は、 を正しく解決し、 com/wicked/cool/resources/styles.css "を参照してください。 相対URL "../resources/styles.css"は、パス ".."のため、 は有効なパスではないため、使用しません。いくつかのクラスのClassLoaderを リソースを見つけるために使用する方がしばしば簡単です。 com.wicked.cool.ui.Main.class.getResource(「Styles.cssを」: 「Styles.cssを」ファイルがメインと同じパッケージに存在する場合たとえば、 次のコードは、正しいURLを与えます).toExternalForm()。

e.e.e. 「相対」URLの例は「/com/wicked/cool/resources/styles.css」です。これは相対的ではなく絶対的なものです。

答えて

1

/com/wicked/cool/resources/styles.css 

com/wicked/cool/resources/styles.css 

両方そのRFC1808で定義されるように相対URLです。ここ

相対はClassLoaderは、URLを解決するために使用する場所への相対的な意味します。 (両方のURLは、権限/プロトコルの一部が欠けている。)

次の例では、スタイルシートを見つけるために新しい場所を追加するURLClassLoaderを使用:TestApplicationを仮定

public class Main { 

    public static void main(String[] args) throws MalformedURLException { 
     File stylesheetDir = ... 

     // classloader able to resolve additional resources located at the given dir 
     ClassLoader classLoader = new URLClassLoader(new URL[] {stylesheetDir.toURI().toURL()}, Main.class.getClassLoader()); 
     Thread thread = new Thread(() -> Application.launch(TestApplication.class, new String[0])); 

     // specify classloader to use 
     thread.setContextClassLoader(classLoader); 

     thread.start(); 
    } 
} 

は、次の開始方法を有する:

public void start(Stage primaryStage) { 
    Scene scene = new Scene(new Group(new Rectangle(100, 100))); 
    primaryStage.setScene(scene); 
    scene.getStylesheets().add("/style.css"); 
    primaryStage.show(); 
} 

およびstyle.cssは、指定されたディレクトリにのみあり、次の内容を含むCSSファイルです。

* { 
    -fx-fill: red; 
} 

Rectangleは赤く表示されます。

thread.setContextClassLoader(classLoader); 

をコメントアウトそして、あなたはデフォルトの黒Rectangleなどの警告を取得します。