Изменить цвет фона строки 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))
Другие вопросы по тегам