Сначала я задал вопрос о том, как добавить недавно добавленную строку flash в JavaFx, затем я рассмотрел множество вопросов, связанных с этой темой (например, javafx: table row flashing). Большинство из них использует setRowFactory и переопределенияupdateItem метода путем добавления анимации временной шкалы, которая изменять состояние pseudoClass ряда. Ниже мой код, я пытаюсь создать FlashControl, который можно использовать повторно.как позволить tableRow flash, даже если он не виден? (JavaFx)
public class TableFlashControl<T> {
private PseudoClass flashHighlight = PseudoClass.getPseudoClass("flash-highlight");
private List<T> newAdded = new ArrayList<>();
private boolean isFilterApplied = false;
private boolean isSorted = false;
public void setIsFilterApplied(boolean isFilterApplied) {
this.isFilterApplied = isFilterApplied;
}
public void add(TableView<T> table){
ListChangeListener<T> change = c -> {
while (c.next()) {
if (c.wasAdded()) {
List<? extends T> added = c.getAddedSubList();
T lastAdded = added.get(0);
if (!isFilterApplied) {
newAdded.add(lastAdded);
}
}
}
};
table.getItems().addListener(change);
table.setRowFactory(param -> new TableRow<T>() {
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
return;
}
if (newAdded.contains(item)) {
if (isSorted) {
new Thread(()->{
Timeline flasher = new Timeline(
new KeyFrame(Duration.seconds(0.4), e -> pseudoClassStateChanged(flashHighlight, true)),
new KeyFrame(Duration.seconds(0.8), e -> pseudoClassStateChanged(flashHighlight, false))
);
flasher.setCycleCount(2);
flasher.play();
}).start();
if (item == newAdded.get(0)) {
newAdded.clear();
isSorted = false;
}
}else{
if(item == newAdded.get(0)){
isSorted = true;
}
}
}
}
});
}
}
Здесь ListChangeListener связан с table.getItems(), который помогает мне записать вновь вставленной строки.
В одну операцию можно добавить несколько строк, что означает, что newAdded.size() может быть больше 1. Более того, строки вставляются из верхней из Tableview (потому что я отсортировать его с номером.)
В Tableview, не все строки являются видимыми и updateItem методы обновлять только те видимые строки. Моя проблема возникает, когда происходят эти две ситуации (см. Ниже).
Первый сценарий
В первом сценарии, только 4 строки являются видимыми, если пользователь вставляет 5 строк в одно время, не могу записать обновление последней строки (updateItem вон 't вызывается для new_row_5). Таким образом, я не могу ясно newAdded список (делая newAdded.clear())
Второй сценарий
Во втором сценарии, только 4 строки видны снова. Однако есть невидимые строки как сверху, так и снизу видимых строк. Если пользователь вставляет 2 строки, один будет виден, а другой будет невидимым. В моем случае new_row_2 будет мигать, пока new_row_1 остается невидимым. Если пользователь прокручивает в Tableview когда new_row_2 мигает, то он увидит new_row_2 является мигания в то время как new_row_1 является не, который действительно странно.
Я также хочу знать, есть ли способ найти количество видимых строк.
Я все еще новичок в JavaFx, и я не знаю, хороший ли этот метод или нет. Надеюсь, кто-то может помочь мне исправить мои проблемы. Большое спасибо!
Немного OT, но почему вы обертываете 'Timeline' в потоке? Новый поток просто запустит временную шкалу и немедленно выйдет. Вы можете отлично справиться с этой проблемой. –
@James_D Извините, это была моя ошибка ... Я должен удалить новую тему. – ZanderXu