Использовать пользовательский элемент управления в документе FXML - PullRequest
0 голосов
/ 02 июля 2018

Как я могу использовать пользовательский элемент управления в документе FXML? Я знаю, что здесь есть много ответов об этом, но все примеры взяты из существующих элементов управления, таких как кнопки, метки или даже панели. Но я расширяю класс Control, и он не работает.


public class MyControl extends Control {
}

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.Scene?>
<?import javafx.scene.layout.Pane?>
<?import .MyControl?>

<Scene xmlns:fx="http://javafx.com/fxml/1">
    <width>800</width>
    <height>600</height>

    <Pane fx:id="pane">
        <MyControl></MyControl>
    </Pane>
</Scene>

Если я простираюсь от любого другого элемента управления, например кнопки или чего-то еще, он работает нормально. Что мне нужно сделать?

1 Ответ

0 голосов
/ 02 июля 2018

По сути, в JavaFX Control не работает таким образом, для рендеринга всегда требуется Skin<C>. Попробуйте это:

import javafx.scene.control.Control;
import javafx.scene.control.Skin;
import javafx.scene.control.SkinBase;
import javafx.scene.layout.Pane;

public class MyControl extends Control {
    @Override
    protected Skin<?> createDefaultSkin() {
        return new SkinBase<MyControl>(this) {
            {
                Pane pane = new Pane();
                pane.prefWidthProperty().bind(getSkinnable().prefWidthProperty());
                pane.prefHeightProperty().bind(getSkinnable().prefHeightProperty());
                pane.setStyle("-fx-background-color: red");
                getChildren().add(pane);
            }
        };
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.Scene?>
<?import javafx.scene.layout.Pane?>
<?import MyControl?>

<Scene xmlns:fx="http://javafx.com/fxml/1">
    <width>800</width>
    <height>600</height>

    <Pane fx:id="pane">
        <MyControl prefWidth="500" prefHeight="500"></MyControl>
    </Pane>
</Scene>

Но это всего лишь пример. Вам следует изучить лучшие способы создания пользовательских элементов управления, проверьте наличие createDefaultSkin() в обычных классах, таких как Button и Checkbox.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...