gpt4 book ai didi

javafx-2 - JavaFX 从 Scene Builder 访问 Controller 的变量

转载 作者:行者123 更新时间:2023-12-01 10:53:38 26 4
gpt4 key购买 nike

如果我声明类似

@FXML
private final static double PREF_SPACING = 10d;

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

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

当我想改变值时,我想改变它只有一次,在 Controller 类中。

最佳答案

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

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


不要在这里使用@FXML 注释。 @FXML 用于将标记中的值注入(inject) Controller ,而不是相反。

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

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 可用于实例化 Insets 的构建器)。

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:definefx:constant 符号的 fxml 文件,以及(可能)使用引用表达式 $i.insets。 SceneBuilder 可能没有任何 UI 允许您从 SceneBuilder 应用程序中编辑值,因此您可能需要手动编辑与 fx:definefx 相关的 fxml 文件部分:如果您想使用这些结构,请使用常量 元素。

mailing list post on designing resolution independent units in FXML 中有一个使用 fx:define 元素的可执行示例.

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

关于javafx-2 - JavaFX 从 Scene Builder 访问 Controller 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16659879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com