У меня есть 2 набора событий, которые меняют внешний вид строки таблицы.
- таблица мигает, когда мигают некоторые условия
- подсветка таблицы при добавлении нового элемента
Предположим, мой TableView
называется table
, структура моего кода такая:
TableView<Trade> table = ... ;
table.setRowFactory( private final BooleanBinding itemIsNewTrade = Bindings.isNotNull(itemProperty()).and(Bindings.equal(itemProperty(), recentlyAddedTrade));
{
// anonymous constructor:
itemIsNewTrade.addListener((obs, wasNew, isNew) -> pseudoClassStateChanged(newTradePseudoClass, isNew));
}
tv -> {
TableRow<Trade> row = new TableRow<>();
Timeline flasher = new Timeline(
new KeyFrame(Duration.seconds(0.5), e -> {
row.pseudoClassStateChanged(flashHighlight, true);
}),
new KeyFrame(Duration.seconds(1.0), e -> {
row.pseudoClassStateChanged(flashHighlight, false);
})
);
flasher.setCycleCount(Animation.INDEFINITE);
ChangeListener<Boolean> cautionListener = (obs, cautionWasSet, cautionIsNowSet) -> {
if (cautionIsNowSet) {
flasher.play();
} else {
flasher.stop();
row.pseudoClassStateChanged(flashHighlight, false);
}
};
row.itemProperty().addListener((obs, oldItem, newItem) -> {
if (oldItem != null) {
oldItem.cautionProperty().removeListener(cautionListener);
}
if (newItem == null) {
flasher.stop();
row.pseudoClassStateChanged(flashHighlight, false);
} else {
newItem.cautionProperty().addListener(cautionListener);
if (newItem.cautionProperty().get()) {
flasher.play();
} else {
flasher.stop();
row.pseudoClassStateChanged(flashHighlight, false);
}
}
});
return row ;
}
);
ОБНОВЛЕНИЕ: Код для мигания таблицы взят из здесь, а код для подсветки таблицы взят из здесь. Я попытался объединить оба вместе, имея структуру, подобную приведенной выше.
Но я получаю ошибку. Я просто не знаю, как объединить анонимный внутренний класс и лямбда-выражение вместе
Как мне это преодолеть?