Изменить цвет фона строки TornadoFX TableView, продолжая выделять выделенные строки
У меня есть TableView в приложении TornadoFX. Этот TableView показывает список тестов и их статус (не запущен, запущен, пройден, не пройден). Я хочу, чтобы строки пройденных тестов были зелеными, а строки неудачных тестов - красными. Я получил строки, чтобы иметь правильные цвета, но когда я выбираю строку в таблице, она больше не подсвечивается.
Как изменить это форматирование, чтобы выделить выделенные строки и раскрасить строки, чтобы отразить, прошел ли этот тест или не прошел?
tableview = tableview(tests) {
readonlyColumn("Test Name", Test::fileName)
column("Test Execution Status", Test::statusProperty).cellFormat {
text = it.toString()
if (it == TestStatus.PASS)
this.tableRow.style(append = true) { backgroundColor += c("#4CAF50", .5) }
else if (it == TestStatus.FAIL)
this.tableRow.style(append = true) { backgroundColor += c("#FF5722", .5) }
}
columnResizePolicy = SmartResize.POLICY
vgrow = Priority.ALWAYS
selectionModel.selectionMode = SelectionMode.MULTIPLE
bindSelected(lastSelectedTestInTable)
}
2 ответа
Я не эксперт. Я не знаю, есть ли способ ответить на ваш вопрос, используя ваш точный метод (используя inlinecss и устанавливая backgroundColor, не затрагивая выбранную строку backgroundColor). Мое решение использует таблицу стилей и устанавливает независимый backgroundColor для выбранного состояния строки.
class Style : Stylesheet() {
companion object {
val pass by cssclass()
val fail by cssclass()
}
init {
pass{
backgroundColor += c("#4CAF50", .5)
and(selected){
backgroundColor += c("#0096C9", .5)
}
}
fail{
backgroundColor += c("#FF5722", .5)
and(selected){
backgroundColor += c("#0096C9", .5)
}
}
}
}
Теперь вы используете правила "пройти" и "провал". Вместо:
this.tableRow.style(append = true) { backgroundColor += c("#4CAF50", .5) }
Ты используешь:
this.tableRow.addClass(Style.pass)
Вместо:
this.tableRow.style(append = true) { backgroundColor += c("#FF5722", .5) }
Ты используешь:
this.tableRow.addClass(Style.fail)
Помните, что вам нужно добавить Style::class в конструктор приложения.
Редактировать:
Использование toggleClass, как предложил Эдвин Сайз. вместо:
column("Test Execution Status", Test::statusProperty).cellFormat {
text = it.toString()
if (it == TestStatus.PASS)
this.tableRow.addClass(Style.pass)
else if (it == TestStatus.FAIL)
this.tableRow.addClass(Style.fail)
}
Ты используешь:
column("Test Execution Status", Test::statusProperty).cellFormat {
text = it.toString()
this.tableRow.toggleClass(Style.fail,it == TestStatus.FAIL)
this.tableRow.toggleClass(Style.pass,it == TestStatus.PASS)
}
У меня все еще не работает. Классы применяются правильно, но неиспользуемые / пустые / повторно используемые строки по-прежнему имеют исходную окраску, несмотря на то, что они пусты (я бы ожидал, что toggleClass удалит класс в этом случае?)
Мой код выглядит так:
tableRow.toggleClass(Styles.online, (it == AgentStatus.ONLINE))
tableRow.toggleClass(Styles.hidden, (it == AgentStatus.HIDDEN))
tableRow.toggleClass(Styles.timeout, (it == AgentStatus.TIMEOUT))
tableRow.toggleClass(Styles.warning, (it == AgentStatus.WARNING))