JavaFX学习 自定义控件

  Control,Skin,behavior
  在javaFX中每一个UI组件都由一个Control,Skin,behavior组成。首先创建一个Control类继承javafx.scene.control.Control,它持有组件的属性,并且作为主的class,也就是说由它实例化,并且被加到父节点中。skin则负责展示,而behavior负责交互。
   JavaFX学习 自定义控件_第1张图片
  如果组件只需要展示而没有交互,则只需要简单的创建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());

  可以看到下面这张图,它们之间如何互相引用。
JavaFX学习 自定义控件_第2张图片
  在controler.getSkin()的时候是获得的skin,所以需要转化一下才能得到behavior
((SkinBase)getSkin()).getBehavior(); 


原文地址
http://www.guigarage.com/2012/11/custom-ui-controls-with-javafx-part-1/

你可能感兴趣的:(JavaFX,skin,control,behavior)