【问题标题】:How to create new skin for `DatePicker`, javafx如何为`DatePicker`,javafx创建新皮肤
【发布时间】:2023-03-15 03:03:01
【问题描述】:

我想为DatePicker 创建一个新的皮肤类。按照有关如何操作的不同说明,例如guigarage,正确的方法是扩展SkinBase并通过将-fx-skin属性设置为皮肤类名称来加载新的皮肤类,所以我做了,但我得到了这个错误:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: sample.myDatePickerSkin cannot be cast to com.sun.javafx.scene.control.skin.DatePickerSkin
  at com.sun.javafx.scene.control.behavior.DatePickerBehavior.onAutoHide(DatePickerBehavior.java:103)

如果你看看DatePickerBehavior.java:103:

@Override public void onAutoHide() {
        // when we click on some non-interactive part of the
        // calendar - we do not want to hide.
        DatePicker datePicker = (DatePicker)getControl();
        DatePickerSkin cpSkin = (DatePickerSkin)datePicker.getSkin();
        cpSkin.syncWithAutoUpdate();
        // if the DatePicker is no longer showing, then invoke the super method
        // to keep its show/hide state in sync.
        if (!datePicker.isShowing()) super.onAutoHide();
    }

那么我做错了什么吗?或者我也应该写myDatePickerBehavior

【问题讨论】:

  • 请注意 com.sun.javafx.scene.control.skin.BaseSkin 不是公共 API。

标签: javafx


【解决方案1】:

实现皮肤的官方方法是

  • 直接实现Skin

com.sun.javafx.scene‌​.control.skin.BaseSki‌​n 不是已发布的 API。

请注意,对于 Java SE 9 和 Jigsaw,DatePickerSkin 以及其他默认的 skins 将成为已发布的 API,AFAIK。如果满足您的要求,那么扩展它们应该是安全的。

【讨论】:

    【解决方案2】:

    我应该扩展 DatePickerSkin :

    package sample;
    
    import com.sun.javafx.scene.control.skin.DatePickerSkin;
    import javafx.scene.control.DatePicker;
    
    public class customDatePickerSkin extends DatePickerSkin {
        public customDatePickerSkin(DatePicker datePicker) {
            super(datePicker);
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2014-03-15
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多