Control,Skin,behavior
在javaFX中每一个UI组件都由一个Control,Skin,behavior组成。首先创建一个Control类继承javafx.scene.control.Control,它持有组件的属性,并且作为主的class,也就是说由它实例化,并且被加到父节点中。skin则负责展示,而behavior负责交互。
[img]http://dl.iteye.com/upload/attachment/0078/8015/91013797-0130-3489-96c6-23e2cc96a013.png[/img]
如果组件只需要展示而没有交互,则只需要简单的创建behavior,因此只需要继承com.sun.javafx.scene.control.behavior.BehaviorBase。
public class MyCustomControlBehavior extends BehaviorBase { public MyCustomControlBehavior(MyCustomControl control) { super(control); } }
创建一个skin,继承com.sun.javafx.scene.control.skin.BaseSkin,在此类中展示和布局子节点。
public class MyCustomControlSkin extends SkinBase{ public MyCustomControlSkin(MyCustomControl control) { super(control, new MyCustomControlBehavior(control)); } }
创建一个control
public class MyCustomControlSkin extends SkinBase{ public MyCustomControlSkin(MyCustomControl control) { super(control, new MyCustomControlBehavior(control)); } }
3个类创建了,那它们是如何关联的了。从上面可以看到skin可以知道control和behavior,此时只需要让control关联skin。
使用css关联
.custom-control {
-fx-skin: "com.guigarage.customcontrol.MyCustomControlSkin"; }
此时需要在control中加载css
public class MyCustomControl extends Control { public MyCustomControl() { getStyleClass().add("custom-control"); } @Override protected String getUserAgentStylesheet() { return MyCustomControl.class.getResource("customcontrol.css").toExternalForm(); } }
或者直接设置
setSkinClassName(MyControlSkin.class.getName());
可以看到下面这张图,它们之间如何互相引用。
[img]http://dl.iteye.com/upload/attachment/0078/8024/c641df6b-736e-3d05-a95c-ed63a7266a8c.png[/img]
在controler.getSkin()的时候是获得的skin,所以需要转化一下才能得到behavior
((SkinBase)getSkin()).getBehavior();