Проблема. необходимо организовать просмотр изображений в виде слайд-шоу. Изображения хранятся в указанной папке, к-я может иметь вложенные папки.
Требуется создать возможность перебора содержимого папок с учетом вложенности и с фильтрацией
1. Разработайте пользовательский интерфейс по аналогии с плеером, включающим ImageView для показа слайдов, кнопки Запуска и Останова показа, выбора Каталога (Папки) и задания формата изображения (*.png, *jpg)
2. Организуйте считывание файлового каталога во внутреннюю структуру реализации ConcreteAggregate implements Aggregate
{
private String filetop;
private Image bi;
@Override
public Iterator getIterator() {
return new ImageIterator(); }
public ConcreteAggregate (String filetop)
{
this.filetop=filetop; }
private class ImageIterator implements Iterator
{
private int current=1;
@Override
public boolean hasNext() {
3. Используйте паттерн Итератор для навигации по структуре файлового каталога.
Реализуйте конкретный ImageIterator с реализацией методов
boolean hasNext() возвращает true, если следующий слайд есть
Object next() - возвращает изображение и переходит на следующий элемент каталога слайдов
4. Реализуйте в контроллере создание объектов
ImageView view;
ConcreteAggregate slides=new ConcreteAggregate("bmp");
Iterator iterator= slides.getIterator();
и доступ к слайдам в обработчике кнопок через объект-Итератор iter:
Image name=(Image)iterator.next();
Загрузку изображений в ImageView можно выполнять из папки ресурсов src/main/resources
view.setImage(new Image("/монетка.jpg"));// имя файла как url надо начинать с /
или с помощью стандартного диалога выбрать путь к файлу:
FileChooser fileChooser = new FileChooser();
File file = fileChooser.showOpenDialog(view.getScene().getWindow());//view - любой элемент fx-сцены (элемент управления или панель)
InputStream stream = file.toString();
try {
stream = new FileInputStream(filename);
Image image = new Image(stream);
return image;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
или другие перобразования File->String->URL
5. Для создания анимации обратитесь к Подзадачам этой темы.
Паттерн Итератор предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего представления. Итератор - это интерфейс, включающий необходимые методы для просмотра всех элементов структуры данных. Наиболее распространенные методы:
hasNext() - возвращает true, если все еще в структуре есть элементы для просмотра, и false, если не осталось ни одного.
next() - возвращает следующий элемент в структуре данных.
Клиент (Client) — объект, использующий Итератор.
Aggregate — интерфейс, определяющий структуры классов, которые можно повторять.
ConcreteAggregate— класс, содержащий структуру данных, которую требуется перебрать.
IIterator—Интерфейс, определяющий структуру итератора, включая необходимые методы для выполнения итерации с помощью ConcreteAggregator.
ConcreteIterator— представляет конкретную реализацию итератора, которая будет отвечать за итерацию данных ConcreteAggregate.
Рис. 1 - Диаграмма классов построения приложения по паттерну Итератор
1. Клиент (Client) отправляет запрос на итератор ConcreteAggregate .
2. ConcreteAggregate создает новый итератор.
3. Клиент входит в цикл , с тем чтобы перебрать все элементы по структуре, и цикл заканчивается , когда не осталось элементов для обхода, о чем сигнализирует hasNext().
4. Клиент отправляет запрос на получении нового элемента к итератору с использованием next().
Если остаются элементы, подлежащие проверке, то возврат к шагу 3, это будет повторяться до тех пор, пока не будут проверены все элементы.
Рис. 2 - Диаграмма последовательности работы приложения по паттерну Итератор