gpt4 book ai didi

kotlin - 不能将 fontawesomefx 与 kotlin 和 tornadofx 一起使用

转载 作者:行者123 更新时间:2023-12-02 12:06:53 24 4
gpt4 key购买 nike

我正在尝试使用 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' 以便此代码有效?

最佳答案

您没有发布完整的类(class),但您似乎尝试运行 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 builder 而不是手动添加到根节点。

让我提供一个替代方案:
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取而代之。

关于kotlin - 不能将 fontawesomefx 与 kotlin 和 tornadofx 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42381874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com