2016-05-18 6 views
1

カスタムコントロールChoiceTextFieldがあり、対応するChoiceTextFieldSkinがあります。Gluonプロジェクトでスキンエラーを読み込めません

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

しかし、私は疑問に思う:

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ファイルでスキンを設定することで、エラーを解決することができます:私はException次取得が

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

コントロールが正しく表示され、何が起こっているのですかException

+0

私はあなたの問題を再現することはできません。あなたは何とかGluon Charm TextFieldを拡張していますか? –

+0

いいえ、 'Control'を拡張し、Javaの' TextField'に委譲しています。 (LogManager.getLogManager()。reset()によって無効化されたロギングを有効にした後に例外が発生する可能性があります。 – jns

+0

コントロールに 'button'スタイルのクラスが表示されるのはなぜですか? –

答えて

1

この短いスニペットデカスタムコントロールでビューを作成するには:あなたがControl.createDefaultSkin()のJavadocを見てみると

javafx.scene.control.Control loadSkinClass 
Failed to load skin 'com.gluonhq.impl.charm.a.b.a.ap' for control [email protected][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 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); 
    } 
} 

は同じ例外を示し

新しいインスタンスを作成します。このコントロールのデフォルトのスキンのCSS {@code -fx-skin}でスキンが提供されていない場合、またはsetSkin(...)}でサブクラスに明示的に設定されている場合は、コントロールのスキンを作成するために呼び出されます。

(太字は鉱山)。

を設定すると、チャームがButtonSkinをオーバーライドしてCSSを介して波紋効果を提供することが分かります。例外があります。

あなたが述べたように、この例外は、明示的にCSSを経由してスキンを設定した場合は発生しません。

public ChoiceTextField() { 

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


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

スキンのロード時の例外は再スローされるのではなく、私はロギングをオンにしていないと、私の間違いに気付かなかったでしょう。 – jns

関連する問題