FXMLで宣言的にスタイルシートを設定する 質問する

FXMLで宣言的にスタイルシートを設定する 質問する

HTMLでは、スタイルシートをプログラムで設定できるという便利な機能に慣れています。

<link rel="stylesheet" ... >

しかし、JavaFXで見つけたスタイルシートの設定例では、次のようにプログラムでスタイルシートを設定する必要があります。

scene.getStylesheets().add("/resources/shell.css");

HTML の場合と同様に、FXML でもスタイルシートを設定することは可能ですか?

ベストアンサー1

あなたはできる親ノードにスタイルシートを設定する使用:

parent.getStylesheets().add("/resources/shell.css");

FXML で使用できる要素と属性はパブリック JavaFX Java API から派生しているため、FXML スタイルシート要素 (または互換的に属性) を使用して、親ノードにスタイルシートを割り当てることもできます。すべてのコンテナは親を拡張するため、FXML で参照するコンテナに 1 つ以上のカスタム スタイルシートを設定できます。

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import java.net.URL?>
   ....
<?scenebuilder-stylesheet fruitcombo.css?>

<AnchorPane prefHeight="205.0" prefWidth="168.0"
   styleClass="layout"
   fx:controller="fruit.FruitComboController"
   xmlns:fx="http://javafx.com/fxml">
   <children>
      ....
   </children>
   <stylesheets>
      <URL value="@fruitcombo.css" />
   </stylesheets>
</AnchorPane>

fxmlファイルを参照してくださいこのサンプルfxml ファイルから css ファイルを参照する完全な実行可能サンプル。

上記のコードには、便利な機能がいくつかあります。

スタイルシートURLの奇妙な@プレフィックスは厳密には必要ではありませんが、JavaFXの位置解像度「位置解決演算子 (属性値の先頭に「@」を付けることによって表される) は、属性値が単純な文字列ではなく、現在のファイルに対する相対的な位置として扱われることを指定するために使用されます。」

次の行は実行時には必要ありませんが、シーンビルダーツールそのツールを使用している場合、設計時に必要な CSS スタイルシートを見つけるには:

<?scenebuilder-stylesheet fruitcombo.css?>

コメントに関する更新

警告: これは FXML 1.0 であり、2.0 では動作しません。javafx.fxml.LoadException: URL は有効なタイプではありません。

このコメントは少し間違っていると思います。私が知る限り、現在 FXML 2.0 というものは存在しません。

コメント投稿者が LoadException を受け取った理由は、この投稿の指示スニペットがクラスjava.net.URLを FXML ドキュメントにインポートしていなかったためです。インポートを含めるようにスニペットを更新し、スニペットの意図を明確にするためにjava.net.URL省略記号をいくつか追加しました。....省略記号「通常は、テキストの元の意味を変えずに、単語、文、またはセクション全体を意図的に省略することを示す一連の点」を意味します。

この回答を最もよく理解するには、リンクされたサンプル コードをコンパイルして実行することをお勧めします。

FXMLLoader で InputStream ロード関数を使用しないように警告

新しいものを構築することを強くお勧めしますFXMLローダー場所を指定するのではなく、FXMLLoader.load(入力ストリーム)関数。静的 load() 関数を使用すると、FXML ファイルのベース ロケーションがないため、相対ロケーション参照を解決できません。

つまり、以下のことはしないでください。

 InputStream input = this.getClass().getResourceAsStream("layout.fxml");
 FXMLLoader loader = new FXMLLoader.load(input);
 Parent content = loader.load();

代わりに以下を行ってください:

 String url = this.getClass().getResource("layout.fxml").toExternalForm();
 FXMLLoader loader = new FXMLLoader(url);
 Parent content = loader.load();  

おすすめ記事