【问题标题】:Can't use fontawesomefx with kotlin and tornadofx无法将 fontawesomefx 与 kotlin 和 tornadofx 一起使用
【发布时间】:2017-02-22 16:12:21
【问题描述】:

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

【问题讨论】:

    标签: kotlin tornadofx


    【解决方案1】:

    您没有发布完整的课程,但您似乎尝试在任何方法或初始化块之外运行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 访问器。

    【讨论】:

    • 哇。没有什么比首席程序员回答的更好了!我初步接触了 kotlin 和 tornadofx。所以,我不知道问题的最佳解决方案。无论如何,非常感谢!!!
    • 很高兴为您提供帮助 :) 继续提出问题,很高兴在 SO 上获得有关 TornadoFX 的更多信息!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多