Css 无法在Gluon项目上加载蒙皮错误

Css 无法在Gluon项目上加载蒙皮错误,css,javafx,gluon,gluon-mobile,Css,Javafx,Gluon,Gluon Mobile,我有一个自定义控件ChoiceTextField,带有相应的ChoiceTextFieldSkin protected Skin<?> createDefaultSkin() { return new ChoiceFieldSkin<T, ChoiceTextField<T>>(this); } 我可以通过在CSS文件中设置皮肤来解决此错误: .choice-field{ -fx-skin: "com.energymeter.

我有一个自定义控件
ChoiceTextField
,带有相应的
ChoiceTextFieldSkin

protected Skin<?> createDefaultSkin() {
        return new ChoiceFieldSkin<T, ChoiceTextField<T>>(this);
    }
我可以通过在CSS文件中设置皮肤来解决此错误:

.choice-field{
    -fx-skin: "com.energymeter.control.skin.ChoiceFieldSkin";
}

但是我想知道是什么导致了
异常

这段代码创建了一个带有自定义控件的视图:

public BasicView(String name) {
    super(name);

    setCenter(new StackPane(new ChoiceTextField()));
}

class ChoiceTextField<T> extends Control {

    public ChoiceTextField() {
        getStyleClass().add("button");
    }

    @Override
    protected Skin<?> createDefaultSkin() {
        return new ChoiceFieldSkin<>(this);
    }
}

class ChoiceFieldSkin<T> extends SkinBase<ChoiceTextField<T>> {

    private final TextField textfield;

    public ChoiceFieldSkin(ChoiceTextField<T> control) {
        super(control);
        textfield = new TextField();

        getChildren().add(textfield);
    }
}
如果您查看javadoc中的
Control.createDefaultSkin()

为此控件创建默认外观的新实例。如果没有通过CSS{@code-fx skin}提供外观,或者在具有{@code-setSkin(…)}的子类中显式设置外观,则调用此函数为控件创建外观

(黑体字是我的)

当您设置
getStyleClass().add(“button”)
时,结果是Charm覆盖了ButtonSkin,通过CSS提供连锁反应,所以您有例外

如您所述,如果您通过CSS显式设置外观,则不会发生此异常:

public ChoiceTextField() {

    getStyleClass().addAll("choice-field", "button");
        getStylesheets().add(getClass().getResource("style.css").toExternalForm());
} 


.choice-field {
      -fx-skin: '<package name>.ChoiceFieldSkin'
}
public ChoiceTextField(){
getStyleClass().addAll(“选择字段”、“按钮”);
getStylesheets().add(getClass().getResource(“style.css”).toExternalForm());
} 
.选择字段{
-fx皮肤:'.ChoiceFieldSkin'
}

我无法重现您的问题。你是不是在扩展Glion Charm
TextField
?不,它是在扩展
控件
并授权给Java
TextField
。(在启用日志记录后,我可以看到异常,而日志记录是由
LogManager.getLogManager().reset()禁用的)
为什么您的控件显示
按钮
样式类?我添加了`按钮样式类,因为我想继承外观。我不知道样式类外观也会被加载。删除按钮样式修复了错误。谢谢!很高兴知道加载外观时的异常只会被记录,而不会被重新加载。我如果我没有打开日志记录,我永远不会注意到我的错误。
javafx.scene.control.Control loadSkinClass
Failed to load skin 'com.gluonhq.impl.charm.a.b.a.ap' for control ChoiceTextField@4fb753dd[styleClass=button]
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at javafx.scene.control.Control.loadSkinClass(Control.java:735)
public ChoiceTextField() {

    getStyleClass().addAll("choice-field", "button");
        getStylesheets().add(getClass().getResource("style.css").toExternalForm());
} 


.choice-field {
      -fx-skin: '<package name>.ChoiceFieldSkin'
}