猿问

如何在一行中设置 FXML“填充”属性

我想以与 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 文档中看到,类型强制可以通过为给定类型实现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

  • 定义一个继承Insets的Spacing类,并为该类实现一个valueOf方法

  • 为 GButton 添加一个“space”属性(ObjectProperty<Spacing>的实例),其行为与“padding”相同,并定义其 getter 和 setter。

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



慕莱坞森
浏览 113回答 2
2回答

慕的地6264312

我不知道为什么“填充”属性有这个限制。我在 FXML 文档中看到,类型强制可以通过实现valueOf()给定类型的方法来完成这需要Insets实现一个static valueOf(String)方法。那个类型不存在这个方法;因此您不能简单地通过属性指定值。FXML简介:可以通过在目标类型上static valueOf()定义一个方法来实现其他转换。不过,您可以使用该style属性通过 CSS 指定值。这通常比将对象分配给属性更短:<Button fx:id="btn1" style="-fx-padding: 0 5 10 5;" .../>

收到一只叮咚

我知道这个问题很老,但希望我能提供一些有见地的信息。我有同样的问题; 不幸的是,FXML 没有完整的文档,但在我看来,将初始化模型拼凑在一起使其变得直观。无论如何,您采用了正确的方法,只是没有完全完成:<padding>     <Insets top="10" right="20" bottom="30" left="40"/>     </padding>将创建一个等效于 CSS 的填充padding: 10 20 30 40,当然,您可以更改它(甚至使用我假设的 FXML 变量)。不过,一般来说,任何具有javafx.beans适当约定属性的类,您都可以很容易地在 FXML 中创建自定义组件并像上面那样分配成员值。希望这对任何人都有帮助!
随时随地看视频慕课网APP

相关分类

Java
我要回答