Javafx 2 JavaFX访问控制器&x27;从场景生成器中删除变量

Javafx 2 JavaFX访问控制器&x27;从场景生成器中删除变量,javafx-2,scenebuilder,Javafx 2,Scenebuilder,如果我申报 @FXML private final static double PREF_SPACING = 10d; 或 在控制器类中, 有没有办法在场景生成器中使用它们的值 当我想更改值时,我想更改 仅在控制器类中执行一次。当从FXML标记加载场景图时,@FXML注释使您定义了名称(fx:id)的JavaFX对象能够将其引用反射注入控制器对象中的非公共字段 据我所知,这是一种单向操作。在加载期间,没有将控制器对象中的命名静态类变量注入场景图的规定 通过在控制器对象的类中定义要设置为类变量的

如果我申报

@FXML
private final static double PREF_SPACING = 10d;

在控制器类中, 有没有办法在场景生成器中使用它们的值

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

当从FXML标记加载场景图时,@FXML注释使您定义了名称(fx:id)的JavaFX对象能够将其引用反射注入控制器对象中的非公共字段

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

通过在控制器对象的类中定义要设置为类变量的值,然后在控制器对象的initialize()方法中以编程方式(而不是在标记中)设置适当的对象属性,可以完成与请求非常类似的任务


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

初步回答 我还没有试过下面的所有技巧,但这似乎是你在阅读文章时所采用的方法。如果我有时间,我会稍后尝试并用结果更新这个答案(或者其他人可以这样做并发布一个新的答案,或者编辑这个来创建一个确定的答案)。我现在只想发表一些东西,为你们指出我认为正确的方向

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


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

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

class MyControllerType {
  public final static double PREF_SPACING = 10d;
}
然后在fxml中,引用常数:

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

这里有一个使用
fx:define
元素的可执行示例


总的来说,我认为在维护fxml和java代码之间的这种依赖关系时应该谨慎一点。按照scottb的建议,在控制器
initialize
方法的上下文中,用普通Java代码执行更多此类操作可能更为谨慎。

感谢您的精彩解释!我觉得这个答案更完整,谢谢!我的想法是找到在不同容器上使用相同值的最快方法,而无需显式的fxml编码。
<?import MyControllerType?>
...
<VBox>
  <spacing><MyControllerType fx:constant="PREF_SPACING"/></spacing>
</VBox>
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>