如何在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>
如果我从任何其他控件(例如按钮或其他控件)扩展,则效果很好。我该怎么办?
答案 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
。