FXML 布局的可重用常量?
Reusable constants for FXML layouts?
这是对我之前 question. Somehow, I got the solution for my question from 的跟进,但由于某些原因它从未真正回答我的问题,这导致我提出了这个问题。
原因如下:
- 我发现通过使用
FXMLLoader.namespace
,映射值只能用于 FXMLLoader 正在加载的布局(FXML 文件)。但是,这不符合为其他 FXML 文件提供可重用 常量 的愿望。
- 此外,由于这些常量是在Java代码中定义的,因此在使用时被IDE认为是一个错误,因为它们不是直接在 FXML 文件中定义,然后很难追踪其他异常错误。
所以现在的问题是,如何让 常量 可重用于 FXML 布局?
如 Android,例如 Color resource:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#FFFFFF</color>
</resources>
可以应用于 XML 布局的属性:
android:textColor="@color/white"
JavaFX还有其他可能的方法吗?谢谢大家的回答。
最接近的是通过样式表获得的 CSS。
Constants.css
* {
-my-color: #FFFFFF;
-my-width: 300;
-my-height: 400;
}
然后您可以通过 CSS 在任何地方使用它。坏消息是你必须在所有需要应用它的地方添加 Constants.css
。
在代码中:
pane.setStyle("-fx-background-color: -my-color;");
在 FXML 中:
<Pane style="-fx-background-color: -my-color;" .... />
在另一个特定的 CSS 文件中:
.my-pane {
-fx-background-color: -my-color;
}
所以我想到了一个解决方案,并想到了回答我自己的问题。这不是最好的,但我希望它在将来有用。
这很简单,我们可以为每个常量字段定义一个 getter 方法,在这种情况下,我们可以使用 Expression Binding 从 FXML 轻松访问它们的值。这是一个例子:
Theme.class
package styles;
import javafx.scene.paint.Color;
public final class Theme {
/** Constant field; use Theme.BASE_COLOR */
public static final Color BASE_COLOR = Color.TEAL;
/** Getter method for FXML; use ${theme.baseColor} */
public Color getBaseColor() { return BASE_COLOR; }
}
layout.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.text.Text?>
<HBox xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
alignment="CENTER">
<fx:define>
<!--
Define a reference to our Theme class.
This is convenient because we only need a single
instance of our Theme class for every FXML file.
-->
<styles.Theme fx:id="theme"/>
</fx:define>
<children>
<!-- Now, we can simply use an expression binding here -->
<Text text="Hello, World!" fill="${theme.baseColor}"/>
</children>
</HBox>
这是对我之前 question. Somehow, I got the solution for my question from
原因如下:
- 我发现通过使用
FXMLLoader.namespace
,映射值只能用于 FXMLLoader 正在加载的布局(FXML 文件)。但是,这不符合为其他 FXML 文件提供可重用 常量 的愿望。 - 此外,由于这些常量是在Java代码中定义的,因此在使用时被IDE认为是一个错误,因为它们不是直接在 FXML 文件中定义,然后很难追踪其他异常错误。
所以现在的问题是,如何让 常量 可重用于 FXML 布局?
如 Android,例如 Color resource:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#FFFFFF</color>
</resources>
可以应用于 XML 布局的属性:
android:textColor="@color/white"
JavaFX还有其他可能的方法吗?谢谢大家的回答。
最接近的是通过样式表获得的 CSS。
Constants.css
* {
-my-color: #FFFFFF;
-my-width: 300;
-my-height: 400;
}
然后您可以通过 CSS 在任何地方使用它。坏消息是你必须在所有需要应用它的地方添加 Constants.css
。
在代码中:
pane.setStyle("-fx-background-color: -my-color;");
在 FXML 中:
<Pane style="-fx-background-color: -my-color;" .... />
在另一个特定的 CSS 文件中:
.my-pane {
-fx-background-color: -my-color;
}
所以我想到了一个解决方案,并想到了回答我自己的问题。这不是最好的,但我希望它在将来有用。
这很简单,我们可以为每个常量字段定义一个 getter 方法,在这种情况下,我们可以使用 Expression Binding 从 FXML 轻松访问它们的值。这是一个例子:
Theme.class
package styles;
import javafx.scene.paint.Color;
public final class Theme {
/** Constant field; use Theme.BASE_COLOR */
public static final Color BASE_COLOR = Color.TEAL;
/** Getter method for FXML; use ${theme.baseColor} */
public Color getBaseColor() { return BASE_COLOR; }
}
layout.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.text.Text?>
<HBox xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
alignment="CENTER">
<fx:define>
<!--
Define a reference to our Theme class.
This is convenient because we only need a single
instance of our Theme class for every FXML file.
-->
<styles.Theme fx:id="theme"/>
</fx:define>
<children>
<!-- Now, we can simply use an expression binding here -->
<Text text="Hello, World!" fill="${theme.baseColor}"/>
</children>
</HBox>