2017-02-22 61 views
1

我想創建一些JavaFX按鈕與FontAwesomeFX圖標使用TornadoFX。這是代碼不能使用kotlin和tornadofx fontawesomefx

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

您沒有發佈完整的類,但它看起來像您嘗試在任何方法或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訪問器。

+1

哇。沒有什麼事情可以像領導程序員一樣回答!我最初接觸kotlin和tornadofx。所以,我不知道問題的最佳解決方案。無論如何,非常感謝! –

+0

高興地幫助:)保持問題的到來,很高興在這裏獲得關於TornadoFX的更多信息! –