Это совсем боль...
Из TableCell
вы можете наблюдать за TableRow
через его tableRowProperty()
.
Из TableRow
вы можете наблюдать за элементом в строке через itemProperty()
строки таблицы.
И, конечно же, из элемента в строке вы можете наблюдать за любыми свойствами, определенными в вашем классе модели, и соответствующим образом обновлять список элементов в поле со списком.
Болезненная часть заключается в том, что любое из этих значений может и в какой-то момент изменится. Таким образом, вещи, за которыми вам нужно наблюдать, постоянно меняются, и вы должны управлять добавлением и удалением слушателей по мере того, как это происходит.
Bindings.select помогает управлять подобными вещами, но начиная с JavaFX 8 он печатает огромные трассировки стека на выходе в качестве предупреждений всякий раз, когда он встречает нулевое значение, которое он делает часто. Поэтому я рекомендую вам самостоятельно управлять слушателями, пока это не будет исправлено. (По какой-то причине команда JavaFX, похоже, не считает это большой проблемой, даже несмотря на то, что обнаружение нулевых значений в пути, определенном в Bindings.select, явно поддерживается в документации по API.)
Просто чтобы сделать его немного более неприятным, метод getTableRow()
в TableCell<S,T>
возвращает TableRow
вместо более очевидного TableRow<S>
. (Возможно, для этого есть причина, которую я не вижу, но...). Так что ваш код дополнительно замусорен приведениями.
Я создал пример, который работает: извиняюсь за то, что он основан на географии США, но я большая часть примера уже написана. Я действительно надеюсь, что что-то упустил и что есть более простые способы сделать это: пожалуйста, не стесняйтесь предлагать что-то, если у кого-то есть идеи получше.
И последнее замечание: библиотека EasyBind может предоставить более простой способ привязки к свойствам по произвольному пути.
person
James_D
schedule
26.03.2014