【问题标题】:How to set FXML "padding" property in one line如何在一行中设置 FXML“填充”属性
【发布时间】:2019-12-25 14:19:36
【问题描述】:

我想以与在 C# XAML 文件中相同的方式定义按钮的填充。而不是写这样的东西:

<Button fx:id="btn1" ...>
    <padding>
        <Insets top="0" right="5" bottom="10" left="5" />
    </padding>
</Button>

<Button fx:id="btn2" ...>
    <padding>
        <Insets topRightBottomLeft="5" />
    </padding>
</Button>

,写起来会更容易:

<Button fx:id="btn1" ... padding="0 5 10 5" />
<Button fx:id="btn2" ... padding="5" />

我不知道为什么“填充”属性有这个限制。我在FXML documentation 上看到 type coercion 可以为给定类型实现 valueOf() 方法:

public static Insets valueOf(String info) {
    // Data retrieval
}

但我不知道该放在哪里,因为 Insets 类被锁定(JDK)。因为这是一个静态方法,所以我认为该方法可以在其他地方实现,但是启动应用程序总是给我一个强制错误:

Caused by: java.lang.IllegalArgumentException: Unable to coerce 0 5 10 5 to class javafx.geometry.Insets.

目前,我找到的唯一解决方案是:

  • 定义一个名为 GButton 的新 FXML 组件,该组件继承 Button
  • 定义一个继承InsetsSpacing类并为该类实现一个valueOf方法
  • 为 GButton(ObjectProperty 的实例)添加与“填充”行为相同的“空格”属性,并定义其 getter 和 setter。

是否有一种简单的方法可以将 FXML“填充”定义到 Button 标记中,而无需创建从 Insets 继承的类?
顺便说一句,如果问题有用,别忘了点赞:)

【问题讨论】:

    标签: java javafx padding coercion type-coercion


    【解决方案1】:

    我不知道为什么“填充”属性有这个限制。我在 FXML 文档中看到,类型强制可以通过为给定类型实现 valueOf() 方法来完成

    这需要Insets 实现static valueOf(String) 方法。该方法在该类型中不存在;因此,您不能简单地通过属性指定值。

    Introduction to FXML:

    可以通过在目标类型上定义static valueOf()方法来实现额外的转换。

    您可以使用 style 属性通过 CSS 指定值。这通常比将对象分配给属性要短:

    <Button fx:id="btn1" style="-fx-padding: 0 5 10 5;" .../>
    

    有关支持的属性/语法的更多信息,请查看the CSS Reference Guide

    【讨论】:

    • 感谢您的反馈,fabian :) CSS 样式是一种解决方案,但它也有局限性: * CSS 样式的性能比直接 FXML 样式稍差,当人机界面很大时,这一点很明显* 是否可以使用该语法绑定数据?我相信 CSS 样式只会在加载 GUI 时应用一次。
    【解决方案2】:

    我知道这个问题很老了,但希望我能提供一些有见地的信息。我有同样的问题;不幸的是,FXML 没有完整的文档,但是在我看来,将初始化模型拼凑起来很直观。

    无论如何,你有正确的方法,只是没有完全完成它:

    <padding>
        <Insets top="10" right="20" bottom="30" left="40"/>
    </padding>
    

    将创建一个与 CSS 的 padding: 10 20 30 40 等效的填充,当然,您可以更改(我假设甚至可以使用 FXML 变量)。

    不过,一般来说,任何在适当约定中具有 javafx.beans 属性的类(有关说明,请参阅 this tutorial),您可以很容易地在 FXML 中创建自定义组件并像使用 @987654325 一样分配成员值@ 上面。

    希望这对任何人都有帮助!

    【讨论】:

      猜你喜欢
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多