2016-05-18 1 views
1

J'ai un contrôle personnalisé ChoiceTextField, avec le ChoiceTextFieldSkin correspondant.Impossible de charger l'erreur de skin sur le projet Gluon

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

Le contrôle est affiché correctement, même si je reçois suivant 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 

je peux résoudre l'erreur en mettant la peau dans le fichier CSS:

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

Mais je me demande qu'est-ce qui cause le Exception

+0

Je ne peux pas reproduire votre problème. Êtes-vous en train d'étendre Gluon Charm 'TextField'? –

+0

Non, il étend 'Control' et déléguer à Java' TextField'. (J'ai pu voir l'exception après avoir activé la journalisation que j'avais désactivée par 'LogManager.getLogManager(). Reset()' – jns

+0

Pourquoi votre contrôle montre la classe de style 'button'? –

Répondre

1

Ce petit extrait de co de créer une vue avec un contrôle personnalisé:

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

montre la même exception:

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) 

Si vous allez voir la javadoc pour Control.createDefaultSkin():

Créer une nouvelle instance de l'habillage par défaut pour ce contrôle. Ceci est appelé pour créer un habillage pour le contrôle si aucun habillage n'est fourni via CSS {@code -fx-skin} ou défini explicitement dans une sous-classe avec {@code setSkin (...)}.

(le gras est le mien).

Et lorsque vous définissez getStyleClass().add("button"), il s'avère que le charme remplace le ButtonSkin pour fournir l'effet d'entraînement via CSS, de sorte que vous avez votre exception.

Comme vous l'avez mentionné, cette exception ne se produira pas si vous définissez explicitement la peau via CSS:

public ChoiceTextField() { 

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


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

Bon à savoir que les exceptions sur le chargement d'un skin ne sont enregistrées que pour être rethrown Je n'aurais jamais remarqué mon erreur, si je n'avais pas activé la journalisation. – jns