No se puede usar fontawesomefx con kotlin y tornadofx

Estoy intentando crear algunos botones JavaFX con íconos FontAwesomeFX usando TornadoFX. Este es el código

data class ButtonInfo(val text: String, val icon: GlyphIcon<*>) val list = listOf( ButtonInfo("Cadastro", FontAwesomeIconView(FontAwesomeIcon.ADDRESS_BOOK)), ButtonInfo("Corrida", MaterialDesignIconView(MaterialDesignIcon.RUN)), ButtonInfo("Classificocoa", FontAwesomeIconView(FontAwesomeIcon.LIST))) list.forEach { it.icon.size = "3em" val bt = Button(it.text, it.icon) bt.contentDisplay = ContentDisplay.TOP bt.minWidth = 200.0 root += bt } 

En la compilation recibo este error:

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

no está satisfecho: tipo inferido CaptunetworkingTypeConstructor (*) no es un subtipo de GlyphIcons!

El GlyphIcon es una class abstracta de Java con esta statement:

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

No sé cómo revertir este error. Si declaro:

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

No obtengo el error mencionado anteriormente, pero extraño la propiedad '.size'. ¿Cómo puedo declarar mi class 'ButtonInfo' para que este código funcione?

No list.forEach tu class completa, pero parece que intentas ejecutar la list.forEach instrucción fuera de cualquier método o bloque de inicio? Kotlin se confunde con el acceso del size , use setSize() para evitar el problema.

Aquí hay una class completa con cambios mínimos en su muestra que comstack y ejecuta, y le muestra los icons en una vbox.

 data class ButtonInfo(val text: String, val icon: GlyphIcon<*>) class IconView : View() { val list = listOf( ButtonInfo("Cadastro", FontAwesomeIconView(FontAwesomeIcon.ADDRESS_BOOK)), ButtonInfo("Corrida", MaterialDesignIconView(MaterialDesignIcon.RUN)), ButtonInfo("Classificocoa", FontAwesomeIconView(FontAwesomeIcon.LIST))) override val root = vbox { list.forEach { it.icon.setSize("3em") button(it.text, it.icon) { contentDisplay = ContentDisplay.TOP minWidth = 200.0 } } } } 

Usé el generador de button lugar de agregarlo manualmente al nodo raíz.

Déjame ofrecerte una alternativa:

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

Luego define esta function en un file de utilidad:

 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 } 

Hace que sea mucho más fácil ver lo que sucede en el sitio de llamadas.

Además, setSize("3em") solo está disponible para admitir Scene Builder. Considere usar el glyphSize lugar.

  • ¿Cómo agregar leyenda secundaria al gráfico JavaFX?
  • TornadoFX: el text de la label no se actualiza
  • En TornadoFX, ¿cómo puedo separar layouts en diferentes classs y luego usarlos en el generador?
  • Cómo cambiar la vista en TornadoFx
  • Desplazamiento suave en JavaFX TableView
  • ¿Cómo cancelar la suscripción a events en TornadoFX?
  • ¿Cómo puedo crear un encabezado de columna nested / dividido usando TornadoFx?
  • Usar bibliotecas de UI de terceros con TornadoFX
  • CellCache se representa inesperadamente en TableView con tornadoFX
  • TornadoFX con TestFX cierra la vista después de cada TestCase
  • Cómo implementar TornadoFX WebEngine Callback en Kotlin