无法在Gluon Project上加载皮肤错误

时间:2016-05-18 19:26:02

标签: css javafx gluon gluon-mobile

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

protected Skin<?> createDefaultSkin() {
        return new ChoiceFieldSkin<T, ChoiceTextField<T>>(this);
    }

虽然我遵循Exception

,但控件已正确显示
Failed to load skin 'com.gluonhq.impl.charm.a.b.a.ap' for control ChoiceTextField[id=choiceCounter, styleClass=choice-field colored button flat]
java.lang.IllegalArgumentException: argument type mismatch

我可以通过设置CSS文件中的皮肤来解决错误:

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

但我想知道导致Exception

的原因

1 个答案:

答案 0 :(得分:1)

使用自定义控件创建视图的这段代码:

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

显示相同的例外:

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)

如果你看一下Control.createDefaultSkin()的javadoc:

  

为此控件创建默认外观的新实例。如果没有通过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'
}