5

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

4

1 回答 1

6

您没有发布完整的课程,但看起来您尝试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访问器。

于 2017-02-22T08:03:50.270 回答