不能与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
访问器来代替。