在FXML文档中使用自定义控件

时间:2018-07-02 11:59:31

标签: java javafx

如何在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 :(得分:0)

基本上,在JavaFX中(a * b) * c != a * (b * c) 不能那样工作,它始终需要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