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();