6

アプリケーションのデフォルトのフォントタイプとサイズを、コードを使用して適用するCSSファイルに保存しました。

label.getStyleClass().add("labelStyleClass");

ただし、ユーザーが独自の設定を指定した場合、デフォルト設定(上記で設定)を上書きし、ユーザーが指定したフォントサイズを使用する必要があるという機能も追加しました。

double userSize = readFromFile;
label.setFont(new Font(userSize));

この場合、label.setFont()呼び出しはユーザーによって指定された新しいサイズを設定しません。最初のCSSコードをコメントアウトすると、後で機能します。

回避策はありますか?

注: JavaFXフォーラムにクロスポストされています

4

1 に答える 1

10

これは仕様によるものです。アーキテクチャ上の理由から、cssのオーバーライドのチェーンは次のように機能します。

デフォルトのcaspian.css<API設定<ユーザーのScenecss<ユーザーのParentcss<setStyle()

これがcssリファレンスガイドからの引用です:

JavaFX CSS実装は、次の優先順位を適用します。ユーザーエージェントスタイルシートのスタイルは、シーンまたは親スタイルシートよりも優先度が低いコードから設定された値よりも優先度が低くなります。インラインスタイルが最も優先されます。親インスタンスのスタイルシートは、シーンスタイルシートのスタイルシートよりも具体的であると見なされます。

setStyle()したがって、 API呼び出しの代わりにを使用して、目標を達成できます。次の例を実行してみてください。

public void start(Stage stage) {
    VBox root = new VBox(10);

    Scene scene = new Scene(root, 300, 250);
    // font.css: .labelStyleClass { -fx-font-size: 20 }
    scene.getStylesheets().add(getClass().getResource("font.css").toExternalForm());

    root.getChildren().add(LabelBuilder.create().text("default").build());
    root.getChildren().add(LabelBuilder.create().text("font-css").styleClass("labelStyleClass").build());

    Label lblApi = LabelBuilder.create().text("font-css-api (doesn't work)").styleClass("labelStyleClass").build();
    lblApi.setFont(Font.font(lblApi.getFont().getFamily(), 40));
    root.getChildren().add(lblApi);

    Label lblStyle = LabelBuilder.create().text("font-css-setstyle (work)").styleClass("labelStyleClass").build();
    lblStyle.setStyle("-fx-font-size:40;");
    root.getChildren().add(lblStyle);

    stage.setTitle("Hello World!");
    stage.setScene(scene);
    stage.show();
}
于 2012-09-08T22:09:42.947 に答える