Я искал эту проблему, когда пытался внедрить кинетическую панель прокрутки, аналогичную прокрутке колес Apple iPhone. Предметы в TreeSet
относятся к этому классу:
/**
* Data object that contains a {@code DoubleExpression} bound to an item's
* relative distance away from the current {@link ScrollPane#vvalueProperty()} or
* {@link ScrollPane#hvalueProperty()}. Also contains the item index of the
* scrollable content.
*/
private static final class ItemOffset implements Comparable<ItemOffset> {
/**
* Used for floor or ceiling searches into a navigable set. Used to find the
* nearest {@code ItemOffset} to the current vValue or hValue of the scroll
* pane using {@link NavigableSet#ceiling(Object)} or
* {@link NavigableSet#floor(Object)}.
*/
private static final ItemOffset ZERO = new ItemOffset(new SimpleDoubleProperty(0), -1);
/**
* The current offset of this item from the scroll vValue or hValue. This
* offset is transformed into a real pixel length of the item distance from
* the current scroll position.
*/
private final DoubleExpression scrollOffset;
/** The item index in the list of scrollable content. */
private final int index;
ItemOffset(DoubleExpression offset, int index) {
this.scrollOffset = offset;
this.index = index;
}
/** {@inheritDoc} */
@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;
}
// Double expression has yet to be bound
// If we don't compare by index we will
// have a lot of values ejected from the
// navigable set since they will be equal.
return Integer.compare(index, other.index);
}
/** {@inheritDoc} */
@Override
public String toString() {
return index + "=" + String.format("%#.4f", scrollOffset.get());
}
}
Для DoubleExpression
может потребоваться некоторое время, чтобы быть связанным в задаче runLater платформы JavaFX, поэтому индекс включен в этот класс-оболочку.
Поскольку scrollOffset
всегда меняется в зависимости от положения пользовательской прокрутки на колесе прокрутки, нам необходим способ обновления. Обычно порядок всегда одинаков, так как смещение относительно позиции индекса элемента. Индекс никогда не изменяется, но смещение может быть отрицательным или положительным в зависимости от относительного расстояния элементов от текущего свойства vValue или hValue ScrollPane
.
Чтобы обновить по требованию, только когда это необходимо , просто следуйте указаниям вышеупомянутого ответа Tucuxi.
ItemOffset first = verticalOffsets.first();
verticalOffsets.remove(first);
verticalOffsets.add(first);
, где verticalOffsets - это TreeSet<ItemOffset>
. Если вы делаете распечатку из
устанавливайте каждый раз, когда вызывается этот фрагмент обновления, вы увидите, что он обновляется.