Ich habe dieses Problem nachgeschlagen, als ich versuchte, einen kinetischen Bildlaufbereich zu implementieren, der den Apple iPhone-Radschriftrollen ähnelt. Die Elemente in der TreeSet
sind diese Klasse:
private static final class ItemOffset implements Comparable<ItemOffset> {
private static final ItemOffset ZERO = new ItemOffset(new SimpleDoubleProperty(0), -1);
private final DoubleExpression scrollOffset;
private final int index;
ItemOffset(DoubleExpression offset, int index) {
this.scrollOffset = offset;
this.index = index;
}
@Override
public int compareTo(ItemOffset other) {
double d1 = scrollOffset.get();
double d2 = other.scrollOffset.get();
if (d1 < d2) {
return -1;
}
if (d1 > d2) {
return 1;
}
return Integer.compare(index, other.index);
}
@Override
public String toString() {
return index + "=" + String.format("%#.4f", scrollOffset.get());
}
}
Es DoubleExpression
kann einen Moment dauern, bis eine runLater-Task der JavaFX-Plattform gebunden ist. Aus diesem Grund ist der Index in dieser Wrapper-Klasse enthalten.
Da sich die scrollOffset
Position basierend auf der Scrollposition des Benutzers am Scrollrad ständig ändert, benötigen wir eine Möglichkeit zum Aktualisieren. Normalerweise ist die Reihenfolge immer dieselbe, da der Versatz relativ zur Position des Artikelindex ist. Der Index ändert sich nie, aber der Versatz kann negativ oder positiv sein, abhängig von der relativen Entfernung der Elemente von der aktuellen vValue- oder hValue-Eigenschaft der ScrollPane
.
Befolgen Sie einfach die Anweisungen der obigen Antwort von Tucuxi, um bei Bedarf nur bei Bedarf zu aktualisieren .
ItemOffset first = verticalOffsets.first();
verticalOffsets.remove(first);
verticalOffsets.add(first);
Dabei ist vertikaleOffsets a TreeSet<ItemOffset>
. Wenn Sie bei jedem Aufruf dieses Update-Snippets einen Ausdruck des Sets erstellen, werden Sie feststellen, dass es aktualisiert wird.