不能与kotlin和tornadofx一起使用fontawesomefx

我正在尝试使用TornadoFX创建一些带有FontAwesomeFX图标的JavaFX按钮。 这是代码

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 } 

在编译时,我得到这个错误:

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

不满意:推断类型CapturedTypeConstructor(*)不是GlyphIcons的子类型!

GlyphIcon是这个声明的Java抽象类:

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

我不知道如何扭转这个错误。 如果我声明:

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

我没有得到上面提到的错误,但我想念'.size'属性。 我怎样才能声明我的班'ButtonInfo',这样的代码工作?

你没有发布你的完整的类,但它看起来像你试图在任何方法或init块之外运行list.forEach指令? Kotlin被size访问器弄糊涂了,使用setSize()来避免这个问题。

这是一个完整的类,只需对编译和运行的示例进行最小限度的更改,然后在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 } } } } 

我使用了button器,而不是手动添加到根节点。

让我提供一个替代方案:

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

然后在一个实用程序文件中定义这个函数:

 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 } 

这使得更容易看到呼叫站点正在发生的事情。

此外, setSize("3em")仅用于支持Scene Builder。 考虑使用glyphSize访问器来代替。