SceneBuilder, Как перетащить узел в пользовательский элемент управления.[JavaFX] - PullRequest
0 голосов
/ 26 января 2019

Вопрос

Мой вопрос относительно прост, я создал пользовательский элемент управления , и я хотел бы перетащить «Узлы» из «SceneBuilder» внутри него,(См. Изображение ниже)

Например

public class CustomControl extends Control {}

Я создаю «StackPane», затем добавляю свой элемент управления внутрь, затем внутрьэто я добавляю еще один "стек стек"

  • стек стек
    • CustomControl
      • стек стек

JavaFx Пример

Вы можете посмотреть этот класс, чтобы дать вам представление о том, что я пытаюсь сделать.

public class SplitPane extends Control {}

SplitPane JavaDoc

Или этот:

public class TitledPane extends Labeled {}

TitledPane JavaDoc

Среда

Версия My Scene Builder: 8.5.0 [Gluon]

Моя версия Java: 1.8.0_191 [Oracle]

Пример пользовательского элемента управления

Не забудьте, что это простой пример

@DefaultProperty("contentProperty")
public class CrushPane extends Control {
    // Fields

    private ObjectProperty<Node> contentProperty = new SimpleObjectProperty<>(this, "contentProperty");

    // Constructor

    public CrushPane() {
        this(null);
    }


    public CrushPane(Node content) {
        setContent(content);
    }

    // Getters and Setters

    public Node getContent() {
        return contentProperty.get();
    }

    public ObjectProperty<Node> contentProperty() {
        return contentProperty;
    }

    public void setContent(Node content) {
        contentProperty.set(content);
    }

    // Override methods

    @Override
    protected Skin<?> createDefaultSkin() {
        return new CrushPaneSkin(this);
    }
}

Скин

public class CrushPaneSkin extends SkinBase<CrushPane> {
    //-----------------------------------------------
    //Fields

    private final ChangeListener<Node> contentChanged = (ob, o, n) -> onContentChanged(n);

    private AnchorPane root;

    //-----------------------------------------------
    //Constructor

    public CrushPaneSkin(CrushPane crushPane) {
        super(crushPane);

        this.root = new AnchorPane();

        getChildren().add(this.root);

        crushPane.contentProperty().addListener(contentChanged);
    }

    //-----------------------------------------------
    //Events

    private void onContentChanged(Node newValue) {
        ObservableList<Node> children = root.getChildren();

        children.clear();

        if (newValue != null) {
            children.add(newValue);

            AnchorPane.setBottomAnchor(newValue, 0.0d);
            AnchorPane.setTopAnchor(newValue, 0.0d);
            AnchorPane.setLeftAnchor(newValue, 0.0d);
            AnchorPane.setRightAnchor(newValue, 0.0d);
        }
    }
}

Не забудьте добавить банку в сценостроитель.

В Scene Builder

Изображение, когда я пытаюсь перетащить StackPane в свой пользовательский элемент управления

Спасибозаранее за вашу помощь

...