栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么JavaFX中没有ObservableQueues?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么JavaFX中没有ObservableQueues?

正如@TomasMikula在@eckig(现已删除)的答案中所说,对的需求可能不足

ObservableQueue
。如果您有可靠的用例,则应考虑提交功能请求。

同时,通过子类化和包装实现来创建快速,肮脏的

ObservableQueue
实现
Queue
并添加“可观察性”
并不难。子类化是“快速”部分,也是“脏”部分,因为您同时公开方法和方法。因为任意方法没有唯一的实现方法(我可以看到)是迭代直到。任何用于迭代的操作(将其视为)都会及时运行。有了这一警告,以下内容应该可以很好地工作:
ObservableListbase``Queue``ObservableListbase``List``Queue``Queue``get(intindex)``index``get``ObservableQueue``List``O(n^2)

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 ;        public ObservableQueue(Queue<E> queue) {        this.queue = queue ;    }        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();    }}

您可以

ListChangeListener
向此注册,以通知队列修改。(请注意,如果您要支持提取程序和更新通知,则需要做更多的工作…)。

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());    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/410450.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号