3

JavaFXのドキュメントは、プロパティがCSSルートクラスで定義されている場合、シーン内の任意のオブジェクトから参照できることを示唆しているようです。

.rootスタイルクラスには、UIで一貫性を提供するために他のスタイルで使用できるプロパティが含まれています。たとえば、プロパティ-fx-focused-baseは.rootスタイルで定義されています。このプロパティは、他のUIコントロールのスタイルで、フォーカスがある場合のコントロールの色として使用されます。

たとえば、次の単純なアプリケーションでは、次のようになります。

public class Main extends Application {

@Override
public void start(Stage stage) throws Exception {
    AnchorPane pane = new AnchorPane();
    Scene s = new Scene(pane, 800, 600);

    pane.getStylesheets().add("test.css");
    pane.getStyleClass().add("test");

    System.out.println("Root pane style classes:");
    for (String clazz : pane.getStyleClass())
        System.out.println(clazz);

    stage.setScene(s);
    stage.show();
}

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

次のスタイルシートtest.cssを使用します。

.test {
-fx-background-color: -fx-base;
}

結果は次のようになります。

Root pane style classes:
root
test
WARNING: com.sun.javafx.css.StyleHelper calculateValue Could not resolve '-fx-base' while resolving lookups for '-fx-background-color' from rule '*.test' in stylesheet test.css

(警告からファイルパスを削除しました)

-fx-baseを解決できないのはなぜですか?それは明らかにcaspian.cssに含まれています...

4

1 に答える 1

5

ここでの問題は、スタイルシート (caspian.css) が遅延ロードされていることです。したがって、コンポーネントが構築されていない限り (必ずしも追加されていなくても)、スタイルシートは解決されません。レイアウト コンテナー (AnchorPane など) は、スタイルシートの読み込みをトリガーしません。一方、コントロール (ボタン/チェックボックス/ラベルなど) は、スタイルシートの読み込みをトリガーします。

この動作を説明するために、上記のテスト ケースの更新版を次に示します。

public class Main extends Application {

@Override
public void start(Stage stage) throws Exception {
    AnchorPane pane = new AnchorPane();

    new Button(); // Trigger loading of default stylesheet

    Scene s = new Scene(pane, 800, 600);
    pane.getStylesheets().add("test.css");
    pane.getStyleClass().add("test");

    System.out.println("Root pane style classes:");
    for (String clazz : pane.getStyleClass())
        System.out.println(clazz);

    stage.setScene(s);
    stage.show();
}

public static void main(String[] args) {
    Application.launch();
}
}
于 2012-11-28T22:45:06.157 に答える