1

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

4

1 に答える 1

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)

の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'
}
于 2016-05-18T22:47:40.547 に答える