2017-02-22 51 views
1

Я пытаюсь создать некоторые кнопки JavaFX с иконками FontAwesomeFX, используя TornadoFX. Это кодНе могу использовать fontawesomefx с kotlin и tornadofx

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

Вы не опубликовали свой полный класс, но похоже, что вы пытаетесь запустить команду list.forEach вне любого метода или блока init? 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

Ничего себе. Ничего похожего не ответит ведущий программист! У меня начальный контакт с котлином и торнадофом. Итак, я не знаю лучших решений проблемы. Во всяком случае, спасибо большое !!! –

+0

С удовольствием помогите :) Продолжайте задавать вопросы, хорошо получить больше информации о TornadoFX здесь, на SO! –