如何在自定义 JavaFX 窗格中继承属性
How to inherit properties in custom JavaFX panes
我想制作 JavaFX 的 AnchorPane 组件的几个子类,但在每种情况下都继承 AnchorPane 的布局功能。我可以定义一个子类:
package tuto;
import javafx.scene.Node;
import javafx.scene.layout.AnchorPane;
public class TutoPane extends javafx.scene.layout.AnchorPane {
protected void layoutChildren() {
super.layoutChildren();
}
}
... 有趣的是,我还可以将其导入到 Scene Builder 中。但是,Scene Builder 不识别继承关系。如果我在 Scene Builder 中将一个普通的 AnchorPane 放在我的自定义 TutoPanes 之一旁边,我会得到这个:
如您所见,放置在 AnchorPane(绿色)内部的控件具有由四个 Anchor Pane 约束定义的定位。
然而,当我尝试使用 TutoPane 时,我得到了这个:
放置在 TutoPane(深石板蓝)内的控件卡在左上角,"layout" 属性没有给我四个 AnchorPane 约束,我希望找到可用的,因为遗产。我需要做什么才能让 Scene Builder 将我的自定义窗格识别为 AnchorPane?是否有适用于 JavaFX 的 JavaBeans 规范的等价物?
出于绝望,我查看了 source code for the Scene Builder product 并查看了 "scene" 后面发生的事情。
作者对其进行了硬编码,以根据 class 名称和 属性 名称的组合来检测属性。 AnchorPaneConstraintsEditor
是硬编码布局,检测是否需要显示它取决于编辑器发现 Editor.topAnchorPropName
、Editor.rightAnchorPropName
、Editor.bottomAnchorPropName
和 Editor.leftAnchorPropName
在父组件中。这些是编辑器中定义的常量 class:
public static final String topAnchorPropName = "AnchorPane.topAnchor";
public static final String rightAnchorPropName = "AnchorPane.rightAnchor";
public static final String bottomAnchorPropName = "AnchorPane.bottomAnchor";
public static final String leftAnchorPropName = "AnchorPane.leftAnchor";
不用说,这种设计不利于专业化,并且违反了 JavaBeans 规范中关于组件内省的许多基本原则。
它也使得子classing AnchorPane 和继承它的布局约束完全不可能。看来没有解决办法。如果还有人知道方法,请大家分享。
SceneBuilder 不在其属性面板中显示锚点约束字段。在 fxml 中添加锚点约束,因为继承的锚点窗格 class 未被场景构建器工具识别。
请看下面的代码。 HolderPane 是 AnchorPane 的子项 class,此处 HolderPane 的子项使用锚点值进行了硬编码。
<HolderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
minWidth="-Infinity" prefHeight="600.0" prefWidth="500.0"
xmlns="http://javafx.com/javafx/8.0.111"
xmlns:fx="http://javafx.com/fxml/1">
<children>
<AnchorPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
</AnchorPane>
</children>
我想制作 JavaFX 的 AnchorPane 组件的几个子类,但在每种情况下都继承 AnchorPane 的布局功能。我可以定义一个子类:
package tuto;
import javafx.scene.Node;
import javafx.scene.layout.AnchorPane;
public class TutoPane extends javafx.scene.layout.AnchorPane {
protected void layoutChildren() {
super.layoutChildren();
}
}
... 有趣的是,我还可以将其导入到 Scene Builder 中。但是,Scene Builder 不识别继承关系。如果我在 Scene Builder 中将一个普通的 AnchorPane 放在我的自定义 TutoPanes 之一旁边,我会得到这个:
如您所见,放置在 AnchorPane(绿色)内部的控件具有由四个 Anchor Pane 约束定义的定位。
然而,当我尝试使用 TutoPane 时,我得到了这个:
放置在 TutoPane(深石板蓝)内的控件卡在左上角,"layout" 属性没有给我四个 AnchorPane 约束,我希望找到可用的,因为遗产。我需要做什么才能让 Scene Builder 将我的自定义窗格识别为 AnchorPane?是否有适用于 JavaFX 的 JavaBeans 规范的等价物?
出于绝望,我查看了 source code for the Scene Builder product 并查看了 "scene" 后面发生的事情。
作者对其进行了硬编码,以根据 class 名称和 属性 名称的组合来检测属性。 AnchorPaneConstraintsEditor
是硬编码布局,检测是否需要显示它取决于编辑器发现 Editor.topAnchorPropName
、Editor.rightAnchorPropName
、Editor.bottomAnchorPropName
和 Editor.leftAnchorPropName
在父组件中。这些是编辑器中定义的常量 class:
public static final String topAnchorPropName = "AnchorPane.topAnchor";
public static final String rightAnchorPropName = "AnchorPane.rightAnchor";
public static final String bottomAnchorPropName = "AnchorPane.bottomAnchor";
public static final String leftAnchorPropName = "AnchorPane.leftAnchor";
不用说,这种设计不利于专业化,并且违反了 JavaBeans 规范中关于组件内省的许多基本原则。
它也使得子classing AnchorPane 和继承它的布局约束完全不可能。看来没有解决办法。如果还有人知道方法,请大家分享。
SceneBuilder 不在其属性面板中显示锚点约束字段。在 fxml 中添加锚点约束,因为继承的锚点窗格 class 未被场景构建器工具识别。
请看下面的代码。 HolderPane 是 AnchorPane 的子项 class,此处 HolderPane 的子项使用锚点值进行了硬编码。
<HolderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
minWidth="-Infinity" prefHeight="600.0" prefWidth="500.0"
xmlns="http://javafx.com/javafx/8.0.111"
xmlns:fx="http://javafx.com/fxml/1">
<children>
<AnchorPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0
AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
</AnchorPane>
</children>