2016-05-18 10 views
1

Ich habe ein benutzerdefiniertes Steuerelement ChoiceTextField, mit der entsprechenden ChoiceTextFieldSkin.Fehler beim Laden des Hautfehlers auf Gluon Projekt

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

Die Steuerung wird korrekt angezeigt, obwohl ich Exception folgende erhalten:

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 

I, indem die Haut in der CSS-Datei, um den Fehler beheben können:

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

Aber ich frage mich, Was verursacht die Exception

+0

Ich kann nicht Ihr Problem reproduzieren. Verlängst du irgendwie Gluon Charm 'TextField'? –

+0

Nein, es erweitert 'Control' und delegiert an Java' TextField'. (Ich konnte die Ausnahme sehen, nachdem ich die Protokollierung aktiviert hatte, die ich durch 'LogManager.getLogManager() deaktiviert hatte.) Reset() ' – jns

+0

Warum zeigt Ihre Steuerung' button' style class? –

Antwort

1

Dieser kurze Ausschnitt von co de eine Ansicht mit einem benutzerdefinierten Steuerelement zu erstellen:

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

zeigt die gleiche Ausnahme:

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) 

Wenn Sie einen Blick auf die javadoc für Control.createDefaultSkin() haben:

Erstellen Sie eine neue Instanz der Standard-Skin für dieses Steuerelement. Dies wird aufgerufen, um eine Skin für das Steuerelement zu erstellen, wenn kein Skin über CSS bereitgestellt wird {@code -fx-skin} oder explizit in einer Unterklasse mit {@code setSkin (...)} festgelegt wird.

(fett ist meins).

Und wenn Sie getStyleClass().add("button") setzen, stellt sich heraus, dass Charm die ButtonSkin überschreibt, um den Ripple-Effekt über CSS bereitzustellen, also haben Sie Ihre Ausnahme.

Wie Sie erwähnt haben, wird diese Ausnahme nicht passieren, wenn Sie explizit die Haut über CSS gesetzt:

public ChoiceTextField() { 

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


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

Gut zu wissen, dass Exceptions beim Laden eines Skins nur protokolliert werden, anstatt neu zu tippen Ich hätte meinen Fehler nie bemerkt, wenn ich das Logging nicht eingeschaltet hätte. – jns