Perché non c'è ObservableQueue in JavaFX? Se guardiamo alla documentazione di Java 9 (solo per vedere se ci sono modifiche da 8) per FXCollections, vediamo i metodi di supporto statici per creare set, elenchi e mappe osservabili. Esistono anche alcuni metodi per creare array float e interi osservabili. Tuttavia, non c'è modo di creare un ObservableQueue. L'interfaccia Queue in Java ha molte implementazioni interessanti, tra cui ArrayDeque, DelayQueue, ConcurrentLinkedQueue, PriorityQueue, ecc. Qual è la logica alla base del motivo per cui non vi è alcun supporto per la creazione di ObservableQueues in JavaFX.Perché non ci sono ObservableQueues in JavaFX?
risposta
Come @TomasMikula commenti nella risposta di @ eckig (ora cancellata), probabilmente non c'è abbastanza richiesta per un ObservableQueue
. Se hai un caso d'uso solido, dovresti considerare submitting a feature request.
Nel frattempo, non è troppo difficile creare un breve-e-sporco ObservableQueue
attuazione Queue
e aggiungendo "osservabilità" sottoclasse ObservableListBase
e avvolgendo un'implementazione Queue
. La sottoclasse ObservableListBase
è la parte "rapida", ma anche quella "sporca" perché esponi i metodi List
e i metodi Queue
; dato che un arbitrario Queue
non ha un get(int index)
l'unico modo per implementarlo è quello di iterare fino a index
. Tutto ciò che utilizza get
per iterare attraverso lo ObservableQueue
, considerandolo come List
, verrà eseguito nel tempo O(n^2)
. Con questo avvertimento, il seguente dovrebbe funzionare abbastanza bene:
import java.util.LinkedList;
import java.util.Queue;
import javafx.collections.ObservableListBase;
public class ObservableQueue<E> extends ObservableListBase<E> implements Queue<E> {
private final Queue<E> queue ;
/**
* Creates an ObservableQueue backed by the supplied Queue.
* Note that manipulations of the underlying queue will not result
* in notification to listeners.
*
* @param queue
*/
public ObservableQueue(Queue<E> queue) {
this.queue = queue ;
}
/**
* Creates an ObservableQueue backed by a LinkedList.
*/
public ObservableQueue() {
this(new LinkedList<>());
}
@Override
public boolean offer(E e) {
beginChange();
boolean result = queue.offer(e);
if (result) {
nextAdd(queue.size()-1, queue.size());
}
endChange();
return result ;
}
@Override
public boolean add(E e) {
beginChange() ;
try {
queue.add(e);
nextAdd(queue.size()-1, queue.size());
return true ;
} finally {
endChange();
}
}
@Override
public E remove() {
beginChange();
try {
E e = queue.remove();
nextRemove(0, e);
return e;
} finally {
endChange();
}
}
@Override
public E poll() {
beginChange();
E e = queue.poll();
if (e != null) {
nextRemove(0, e);
}
endChange();
return e ;
}
@Override
public E element() {
return queue.element();
}
@Override
public E peek() {
return queue.peek();
}
@Override
public E get(int index) {
Iterator<E> iterator = queue.iterator();
for (int i = 0; i < index; i++) iterator.next();
return iterator.next();
}
@Override
public int size() {
return queue.size();
}
}
È possibile registrare ListChangeListener
s con questo ricevere una notifica di modifiche alla coda. (Nota che se vuoi supportare gli estrattori e aggiornare le notifiche, devi fare un po 'più di lavoro ...).
import javafx.collections.ListChangeListener.Change;
public class ObservableQueueTest {
public static void main(String[] args) {
ObservableQueue<String> oq = new ObservableQueue<>();
oq.addListener((Change<? extends String> change) -> {
while (change.next()) {
if (change.wasAdded()) {
System.out.println("Added: "+change.getAddedSubList());
}
if (change.wasRemoved()) {
System.out.println("Removed: "+change.getRemoved());
}
if (change.wasUpdated()) {
System.out.println("Updated: "+oq.subList(change.getFrom(), change.getTo()));
}
if (change.wasReplaced()) {
System.out.println("Replaced");
}
}
});
oq.offer("One");
oq.offer("Two");
oq.offer("Three");
System.out.println("Peek: "+oq.peek());
System.out.println("Remove...");
System.out.println(oq.remove());
System.out.println("Element:");
System.out.println(oq.element());
System.out.println("get(1): "+oq.get(1));
System.out.println("Poll: ");
System.out.println(oq.poll());
System.out.println("Poll again:");
System.out.println(oq.poll());
System.out.println("Poll should return null:");
System.out.println(oq.poll());
System.out.println("Element should throw exception:");
System.out.println(oq.element());
}
}
- 1. perché ci sono più fcntl.h in linux?
- 2. Perché non ci sono raccolte simultanee in C#?
- 3. Perché non ci sono concorrenti reali in Javascript?
- 4. Perché non ci sono deadlock in questo scenario?
- 5. Perché non ci sono conversioni implicite in F #?
- 6. Perché non ci sono classi nei metodi in Ruby?
- 7. Perché non ci sono parole chiave di concorrenza in Kotlin?
- 8. Perché non ci sono valori predefiniti personalizzati in proto3?
- 9. Perché non ci sono altri GC senza interruzione
- 10. Se ci sono "problemi noti" perché rilasciare?
- 11. Impossibile connettersi a mysql perché non ci sono utenti
- 12. Perché non ci sono funzionalità di riallocazione negli allocatori C++?
- 13. Perché non ci sono API DirectX per Linux?
- 14. Perché uniq! return nil se non ci sono duplicati
- 15. mpirun - non ci sono abbastanza slot disponibili
- 16. Perché ci sono due np.int64 in numpy.core.numeric._typelessdata (Perché numpy.int64 non numpy.int64?)
- 17. Perché ci" e CI (, ci {.... comportarsi in modo diverso?
- 18. PHP errore, non ci sono dati ricevuti
- 19. Perché non ci sono funzioni per la creazione di eventi da non-eventi in banana reattiva?
- 20. L'operazione di transazione non può essere eseguita perché non ci sono richieste in sospeso di lavoro
- 21. Azure: non ci sono abbonamenti nella directory
- 22. Le applicazioni win32 non sono così orientate agli oggetti e perché ci sono così tanti puntatori?
- 23. non ci sono elementi categorizzati eclipse - Genymotion
- 24. Non ci sono elementi in TeamProject in sito dei report
- 25. Perché ci sono doppi punti interrogativi nel codice JDBC
- 26. Perché ci sono file duplicati quando si estrae l'archivio tar.gz
- 27. Perché ci sono così tanti diversi dialetti di espressioni regolari?
- 28. Perché ci sono così tante diverse convenzioni di chiamata?
- 29. App Engine: perché ci sono classi PhoneNumber, Link, Rating etc?
- 30. Perché ci sono due punti qui? arco :: prima