用于FXML布局的可重用常量?

时间:2018-07-06 00:46:12

标签: java javafx fxml

这是我之前的question的后续工作。不知何故,我从here处获得了问题的解决方案,但是由于某些原因,它从未真正回答我的问题,这使我提出了这个问题。

这是原因:

  • 我发现,通过使用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中还有其他可能的方法吗?感谢您的回答。

2 个答案:

答案 0 :(得分:2)

最接近的是通过样式表的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;
}

答案 1 :(得分:0)

所以我想出了一个解决方案,并想回答自己的问题。这不是最好的方法,但我希望将来会有用。

这非常简单,我们可以为每个常量字段定义一个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>