Как мне превратить Java Deque <T>в DefaultListModel? - PullRequest
3 голосов
/ 18 июля 2011

Я написал класс (назовем его Model.java), который содержит Deque<T>, с методами для постановки в очередь и удаления из очереди элементов. Теперь я пытаюсь связать это с JList GUI. Я сбит с толку тем, как каким-то образом использовать мои «модельные» данные - Deque - в качестве DefaultListModel, который хочет JList. Я все еще изо всех сил пытаюсь получить концепции ОО, поскольку они применимы к программированию GUI. Документация DefaultListModel гласит:

Этот класс слабо реализует API java.util.Vector, поскольку он реализует версию java.util.Vector версии 1.1.x, не поддерживает класс коллекции и уведомляет ListDataListeners о возникновении изменений. В настоящее время он делегирует вектору ....

Есть ли какой-нибудь способ заставить DefaultListModel использовать мой Deque<T> вместо Vector, таким образом позволяя моему коду Model.java оставаться в значительной степени неизменным, в то же время обеспечивая все возможности прослушивания / уведомления бесплатно? Или мне нужно переписать Model.java, чтобы использовать DefaultListModel вместо Deque<T>?

Ответы [ 3 ]

5 голосов
/ 18 июля 2011

Обратите внимание, что конструктор JList принимает ListModel (интерфейс), а не DefaultListModel (реализация). Это принцип ОО (контракт), определяющий, что JList может использовать ЛЮБОЙ объект, который реализует интерфейс ListModel. Из учебника по Java Концепции объектно-ориентированного программирования :

Интерфейс - это контракт между классом и внешним миром. когда класс реализует интерфейс, он обещает обеспечить поведение опубликовано этим интерфейсом.

Поскольку ListModel имеет только четыре метода, вашему классу должно быть очень легко реализовать их и делегировать операции вашему внутреннему Deque. Ваш класс должен быть объявлен как

public class Model implements ListModel
{
     ....

и будет содержать четыре дополнительных метода, реализующих методы ListModel. Реализации могут делать все, что вам нужно под прикрытием, но они должны придерживаться определения ListModel и любого поведения, указанного как часть ListModel контракта, в JavaDoc.

Как только вы это сделаете, вы можете создать JList, передав экземпляр вашего класса Model в конструктор.

1 голос
/ 18 июля 2011

Я не знал, что делать для addListDataListener()

AbstractListModel может быть хорошей отправной точкой, поскольку она уже реализует предписанные методы EventListenerList для работы со слушателями и событиями.

1 голос
/ 18 июля 2011

Для JList вам не нужно использовать DefaultListModel, просто некоторую реализацию интерфейса ListModel.И последнее очень достижимо, используя Deque.

...