3

如果我声明类似

@FXML
private final static double PREF_SPACING = 10d;

或者

@FXML
private Insets insets = new Insets(10d);

在控制器类中,有没有办法在 Scene Builder 中使用它们的值?

当我想更改值时,我只想在控制器类中更改一次。

4

2 回答 2

4

初步答案 我还没有尝试过以下所有技术,但这似乎是您阅读文档的方式。如果我有时间,我会稍后尝试并使用结果更新此答案(或者其他人可以这样做并发布新答案或编辑此答案以创建明确的答案)。我现在只想发表一些东西,为您指明我认为正确的方向。

如果以下内容不是您要查找的内容,请在您的问题中添加更多细节以充分描述您想要的内容。


不要在@FXML这里使用注释。 @FXML用于将标记中的值注入控制器,而不是相反。

对于您的第一个常量示例,假设您的控制器类是:

class MyControllerType {
  public final static double PREF_SPACING = 10d;
}

然后在你的 fxml 中,引用常量:

<?import MyControllerType?>
...
<VBox>
  <spacing><MyControllerType fx:constant="PREF_SPACING"/></spacing>
</VBox>

对于不是常量或不是 SceneGraph 一部分的第二个示例,您可以使用一个fx:define元素来实例化该类的一个实例。请注意,您不能直接从 FXML 实例化 Insets 类,因为它没有构建器类,也没有零长度构造器。所以你可以做的是为信息创建另一个占位符类,并在你的 FXML 中实例化对它的引用(或者你可以创建一个 FXML 可以用来实例化插入的 Builder)。

class InsetsHolder {
  private Insets insets = new Insets(10d);
  public Insets getInsets();
}

<?import InsetsHolder?>
<fx:define>
  <InsetsHolder fx:id="i"/>
</fx:define>
<VBox>
  <Button text="Click Me!" VBox.margin="$i.insets"/>
</VBox>

SceneBuilder 应该能够读取使用fx:defineandfx:constant符号的 fxml 文件,以及(可能)使用引用表达式$i.insets。SceneBuilder 可能没有任何 UI 允许您从 SceneBuilder 应用程序中编辑值,因此如果您希望使用这些结构,您可能需要手动编辑与fx:define和元素相关的 fxml 文件部分。fx:constant

在此邮件列表帖子fx:define中,有一个使用元素的可执行示例,用于在 FXML 中设计与分辨率无关的单元。

一般来说,我认为在维护 fxml 和 java 代码之间的这种依赖关系时我会有点谨慎。initialize正如 scottb 所建议的那样,在控制器方法的上下文中,在纯 Java 代码中做更多此类事情可能更谨慎。

于 2013-05-21T00:22:27.840 回答
2

@FXML 注释使您定义的名称 (fx:id) 的 JavaFX 对象能够在从 fxml 标记加载场景图时将它们的引用反射性地注入到控制器对象的非公共字段中。

据我所知,这是一种单向操作。没有规定在加载期间将控制器对象中的命名静态类变量注入场景图中。

您可以通过在控制器对象的类中定义您希望设置为类变量的值,然后在您的控制器对象。

在场景图加载完成之后(因此所有 GUI 对象都将被实例化)但在控制权返回到应用程序的调用代码之前调用 initialize() 方法(如果存在)。

于 2013-05-21T00:11:10.807 回答