2017-02-22 1 views
1

J'essaie de créer des boutons JavaFX avec des icônes FontAwesomeFX en utilisant TornadoFX. Voici le codeJe ne peux pas utiliser fontawesomefx avec kotlin et tornadofx

data class ButtonInfo(val texto: String, val icon: GlyphIcon<*>) 

    val list = listOf(
     ButtonInfo("Cadastro", FontAwesomeIconView(FontAwesomeIcon.ADDRESS_BOOK)), 
     ButtonInfo("Corrida", MaterialDesignIconView(MaterialDesignIcon.RUN)), 
     ButtonInfo("Classificacao", FontAwesomeIconView(FontAwesomeIcon.LIST))) 

    list.forEach { 
     it.icon.size = "3em" 
     val bt = Button(it.texto, it.icon) 
     bt.contentDisplay = ContentDisplay.TOP 
     bt.minWidth = 200.0 
     root += bt 
    } 

Dans la compilation je reçois cette erreur:

Type parameter bound for T in var <T : Enum<T!>!> GlyphIcon<T>.size: String! where T : GlyphIcons! 

est pas satisfait: le type déduit CapturedTypeConstructor (*) n'est pas un sous-type de GlyphIcons!

Le GlyphIcon est une classe abstraite Java avec cette déclaration:

public abstract class GlyphIcon<T extends Enum<T> & GlyphIcons> extends Text 

Je ne sais pas comment tourner autour de cette erreur. Si je déclare:

data class ButtonInfo(val texto: String, val icon: Text) 

Je ne comprends pas l'erreur mentionnée ci-dessus, mais je manque propriété « .Size ». Comment puis-je déclarer ma classe 'ButtonInfo' pour que ce code fonctionne?

Répondre

4

Vous n'avez pas envoyé votre classe complète, mais il semble que vous essayez d'exécuter l'instruction list.forEach en dehors de toute méthode ou bloc d'initialisation? Kotlin se confond avec l'accesseur size, utilisez setSize() pour éviter le problème.

Voici une classe complète avec des changements minimes à votre échantillon qui compile et s'exécute, et vous montre les icônes dans une vbox.

data class ButtonInfo(val texto: String, val icon: GlyphIcon<*>) 

class IconView : View() { 
    val list = listOf(
      ButtonInfo("Cadastro", FontAwesomeIconView(FontAwesomeIcon.ADDRESS_BOOK)), 
      ButtonInfo("Corrida", MaterialDesignIconView(MaterialDesignIcon.RUN)), 
      ButtonInfo("Classificacao", FontAwesomeIconView(FontAwesomeIcon.LIST))) 

    override val root = vbox { 
     list.forEach { 
      it.icon.setSize("3em") 
      button(it.texto, it.icon) { 
       contentDisplay = ContentDisplay.TOP 
       minWidth = 200.0 
      } 
     } 
    } 
} 

I utilisé le générateur button au lieu d'ajouter manuellement vers le noeud racine.

Permettez-moi d'offrir une alternative:

class IconView : View() { 
    override val root = vbox { 
     button("Cadastro").icon(FontAwesomeIcon.ADDRESS_BOOK) 
     button("Corrida").icon(MaterialDesignIcon.RUN) 
     button("Classificacao").icon(FontAwesomeIcon.LIST) 
    } 
} 

Ensuite, vous définissez cette fonction dans un fichier utilitaire:

fun Button.icon(icon: GlyphIcons, minButtonWidth: Double = 200.0) { 
    graphic = when (icon) { 
     is FontAwesomeIcon -> FontAwesomeIconView(icon) 
     is MaterialDesignIcon -> MaterialDesignIconView(icon) 
     else -> throw IllegalArgumentException("Unknown font family ${icon.fontFamily}") 
    } 
    with(graphic as GlyphIcon<*>) { 
     contentDisplay = ContentDisplay.TOP 
     setSize("3em") 
    } 
    minWidth = minButtonWidth 
} 

Il est beaucoup plus facile de voir ce qui se passe sur le site d'appel.

En outre, le setSize("3em") est uniquement disponible pour la prise en charge de Scene Builder. Envisagez d'utiliser l'accesseur glyphSize à la place.

+1

Wow. Rien ne peut être répondu par le programmeur principal! Je suis en contact initial avec kotlin et tornadofx. Donc, je ne connais pas les meilleures solutions pour un problème. En tout cas, merci beaucoup !!! –

+0

Heureux d'aider :) Gardez les questions à venir, il est bon d'obtenir plus d'informations sur TornadoFX ici sur SO! –