Используйте пользовательский элемент управления в документе FXML

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


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>

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


person Yjuq    schedule 02.07.2018    source источник
comment
Я нашел это: docs.oracle.com/javafx/2/fxml_get_started/custom_control. htm   -  person ncmathsadist    schedule 02.07.2018
comment
Это не очень помогает. Если вы посмотрите на коды примеров, они расширяются от других существующих элементов управления. Пишу полный контроль с нуля. На этой странице они используют VBox... | Я раньше тоже пользовался гуглом. После нескольких часов исследований я наконец спросил здесь.   -  person Yjuq    schedule 02.07.2018
comment
Определите Не работает. Что говорит исключение? Работает ли исправление импорта (в любом случае вам, вероятно, следует переместить класс в какой-либо пакет, отличный от пакета по умолчанию). Если нет исключений, опишите, что не так. (Думаю, на экране нет визуального результата...)   -  person fabian    schedule 02.07.2018


Ответы (1)


По сути, в 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.

person turikhay    schedule 02.07.2018