Zuerst ist meine Frage, wie man eine neu hinzugefügte Zeile in JavaFx flashen lässt, dann habe ich eine Menge Fragen zu diesem Thema (wie javafx: table row flashing). Die meisten von ihnen verwenden setRowFactory und Überschreibung die updateItem Verfahren durch eine Zeitleiste Animation Zugabe, die den Zustand der Pseudo der Reihe ändern. Unten ist mein Code, ich versuche ein FlashControl zu erstellen, das wiederverwendet werden kann.wie tableRow blinken lassen, auch wenn es nicht sichtbar ist? (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;
}
}
}
}
});
}
}
Hier ListChangeListener ist im Zusammenhang mit table.getItems() der ich die neu eingefügten Zeile aufnehmen kann.
Es ist möglich, mehrere Zeilen innerhalb einer Operation hinzuzufügen, was bedeutet, dass newAdded.size() größer als 1 sein kann. Was mehr ist, Zeilen aus den oben des Tableview eingefügt werden (weil ich es mit der Nummer sortieren.)
In Tableview, nicht alle Zeilen sichtbar sind und updateItem Methoden nur die sichtbaren Zeilen aktualisieren. Mein Problem tritt auf, wenn diese beiden Situationen eintreten (siehe unten).
Das erste Szenario
Im ersten Szenario nur vier Zeilen sichtbar sind, wenn der Benutzer 5 Reihen innerhalb einer Zeit einfügt, kann ich nicht die letzte Zeile Update (das updateItem won aufnehmen nicht für die new_row_5 aufgerufen werden. Dadurch kann ich nicht klar newAdded Liste (von newAdded.clear tun())
Das zweite Szenario
Im zweiten Szenario, nur 4 Zeilen sind wieder sichtbar. Es gibt jedoch unsichtbare Zeilen sowohl oben als auch unten in den sichtbaren Zeilen. Wenn der Benutzer 2 Zeilen einfügt, wird eins sichtbar und das andere wird unsichtbar sein. In meinem Fall wird new_row_2 blinken, während new_row_1 bleibt unsichtbar. Wenn Benutzer einen Bildlauf bis der Tableview, wenn new_row_2 blinkt, wird er sehen, new_row_2blinkt während new_row_1 ist nicht, die wirklich seltsam ist.
Ich möchte auch wissen, ob es eine Möglichkeit gibt, die Anzahl der sichtbaren Zeilen zu finden.
Ich bin immer noch neu in JavaFx und ich weiß nicht, ob diese Methode gut ist oder nicht. Ich hoffe, dass jemand mir helfen kann, meine Probleme zu beheben. Danke vielmals!
Leicht OT, aber warum wickeln Sie die 'Timeline' in einem Thread? Der neue Thread wird einfach die Timeline starten und sofort beenden. Sie können dies sehr gut auf dem FX Application Thread tun. –
@James_D Sorry, das war meine Schuld ... Ich sollte den neuen Thread entfernen. – ZanderXu