如何在自定义 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.topAnchorPropNameEditor.rightAnchorPropNameEditor.bottomAnchorPropNameEditor.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>