मैंने इस समस्या को देखा जब मैं सेब आईफोन व्हील स्क्रॉल के समान एक गतिशील स्क्रॉल फलक को लागू करने का प्रयास कर रहा था। 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
कुछ समय लग सकता JavaFX मंच की एक runLater कार्य में बंधे होने के लिए, यह क्यों सूचकांक इस आवरण वर्ग में शामिल किया जाता है।
चूंकि scrollOffset
स्क्रॉल व्हील पर उपयोगकर्ता स्क्रॉल स्थिति के आधार पर हमेशा बदल रहा है, हमें अपडेट करने का एक तरीका चाहिए। आमतौर पर ऑर्डर हमेशा समान होता है, क्योंकि ऑफ़सेट आइटम इंडेक्स स्थिति से संबंधित होता है। इंडेक्स कभी भी नहीं बदलता है, लेकिन ऑफसेट वर्तमान vValue से संबंधित सापेक्ष दूरी या ScrollPane
की एचवीएलयू संपत्ति के आधार पर नकारात्मक या सकारात्मक हो सकता है।
को केवल की आवश्यकता होने पर मांग पर अपडेट करने के लिए, बस तुकुक्सी द्वारा उपरोक्त उत्तर के मार्गदर्शन का पालन करें।
ItemOffset first = verticalOffsets.first();
verticalOffsets.remove(first);
verticalOffsets.add(first);
जहां verticalOffsets एक TreeSet<ItemOffset>
है। यदि आप इस अद्यतन स्निपेट को हर बार सेट करते समय सेट से प्रिंट करते हैं, तो आप देखेंगे कि यह अपडेट किया गया है।
+1 अच्छा प्रश्न – skaffman
क्या यह सिर्फ मस्तिष्क जिज्ञासा है, या आप प्रदर्शन या कोड सादगी में कहते हैं, एक विशिष्ट लाभ की तलाश में हैं? – greim
मैं संग्रह के क्रम क्रम को बनाए रखने के लिए एक सरल noninvasive तरीका की तलाश में था क्योंकि घटनाओं के भीतर वस्तुओं को अद्यतन करते हैं। सदस्यता में बदलाव के संग्रह के अन्य उपभोक्ताओं पर साइड इफेक्ट्स हैं। आईएमओ, एक तत्व का एक रिसॉर्ट ट्रिगर करना एक क्रमबद्ध संग्रह के लिए बुनियादी कार्यक्षमता की तरह लगता है। – Stevko