2017-02-23 57 views
0

Я просто озадачил использование funtion cellCache в TornadoFX с Kotlin. Вывод всегда странный и неожиданный, что с этим происходит? Код здесь:CellCache неожиданно появляется в TableView с tornadoFX

data class Person(var name : String, var age : Int, var sex : Boolean) 

class MyView: View() 
{ 
    val list = listOf<Person>(
      Person("Name A", 20, false), 
      Person("Name B", 22, false), 
      Person("Name C", 21, true), 
      Person("Name D", 30, true), 
      Person("Name E", 35, true) 
    ).observable() 

    override val root = stackpane { 

     vbox { 
      tableview(items = list) { 
       column("Name", Person::name) 
       column("Age", Person::age) 
       column("Sex", Person::sex).cellCache{ 
        checkbox{ 
         isSelected = it 
         setOnAction { 
          println("Selection: $isSelected") 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Я ожидаю, что все строки будут оказывать с checkbox в колонке "Sex", но приведенный выше код будет только отображаться два: один selected и другой unselected, что, черт возьми, что происходит с cellcache? Я также нахожу изменения data class с приведенной ниже, и это правильно:

data class Person(var name : String, var age : Int, var sex : SimpleBooleanProperty) 

Однако я должен многое изменить с помощью свойств класса данных в этом случае, я не знаю, почему. Помогите мне, и спасибо заранее!

+0

К сожалению, последний код класса Person не должен использовать класс данных, а просто общий префикс класса. это работает: 'class Person (var name: String, var age: Int, sex: Boolean) { var sex by property (SimpleBooleanProperty (sex)) fun sexProperty() = getProperty (Person :: sex) }' – SpkingR

ответ

0

cellCache создает уникальную ячейку за элемент в вашем списке. Если ваши объекты не реализуют значимых функций equals и hashCode, у вас возникнут проблемы с cellCache, поскольку одна и та же ячейка будет использоваться для нескольких базовых элементов.

Добавление equals и hashCode Реализация, которая гарантирует, что каждый элемент уникален, должен решить проблему. Представляется, что реализация по умолчанию в классе данных Котлин не режет его :)

Если вы не можете или не предоставлять equals и hashCode реализации я бы предложил использовать вместо cellFormat, который не зависит от объекта равенство для создания уникальной ячейки.

Прошу прощения, что в руководстве не указано, я обновляю часть TableView с дополнительной информацией и предупреждением об использовании cellCache.

+0

Большое спасибо, и я должен проверить это в своем коде прямо сейчас. – SpkingR

+0

Спасибо, 'cellFormat' работает для меня! 'graphic = checkbox { isSelected = it setOnAction { println (" Выбор: $ isSelected ") } }' – SpkingR

 Смежные вопросы

  • Нет связанных вопросов^_^