Как получить медиа-данные (заголовок, альбом и т. Д.) Из JavaFX Media-объекта и добавить детали в ObservableList? - PullRequest
0 голосов
/ 22 января 2019

Я создал ArrayList путей к медиафайлам, и я хочу получить подробную информацию о медиафайле, такую ​​как название и информация об альбоме, в моем приложении JavaFX.Я хочу добавить эти детали в ObservableList.Поэтому я создал итератор, который дает путь ко всем медиафайлам.Внутри цикла итератора я создал объект Media.Чтобы получить информацию о мультимедиа из объекта Media, я создал прослушиватель метаданных.Я получил медиа-информацию в лямбда-функции, но я не могу использовать их вне лямбда-функции.Если я добавлю информацию в ObservableList внутри лямбда-функции прослушивателя событий, то из-за итерации метаданных будет вставлено много нулевых значений, и будет вставлена ​​только одна полезная информация.

Вот мой код:

ObservableList<PlayListModel> playListData = FXCollections.observableArrayList();
Iterator<JMPPlayListItem> it = playList.getIterator();
while(it.hasNext()) {
    listMedia = new Media(it.next().getPath());
    PlayListModel playListItem = new PlayListModel();
    listMedia.getMetadata().addListener((MapChangeListener.Change<? extends String, ? extends Object> c)->  {
        if (c.wasAdded()) {
            if ("artist".equals(c.getKey())) {
                playListItem.setArtist(c.getValueAdded().toString());
            } else if ("title".equals(c.getKey())) {
                // It prints title of song
                System.out.println(c.getValueAdded().toString());
                playListItem.setTitle(c.getValueAdded().toString());
            } else if ("album".equals(c.getKey())) {
                playListItem.setAlbum(c.getValueAdded().toString());
            }
        }
    });
    // It print null
    System.out.println(playListItem.getTitle());
    playListData.add(playListItem);
}

System.out.println(c.getValueAdded().toString()) печатает название песни, но вне лямбда-функции System.out.println(playListItem.getTitle()) печатает ноль.Это означает, что playListItem значения объекта не меняются.Я пытался сделать финал playListItem, но это не помогло.Я также попытался инициализировать playListItem объект и playListData.add(playListItem) внутри лямбда-функции, но он вставляет заголовок со многими нулевыми значениями заголовка из-за итерации прослушивателя событий.

Я также тестировал с локальными переменными, но не смог получитьзначения вне слушателя лямбда-функции.

1 Ответ

0 голосов
/ 23 января 2019

Я решил эту проблему.Мое решение - передать объект Media в конструктор класса bean-компонента и создать другой метод в классе bean-компонента, который будет извлекать медиа-информацию и обновлять объект bean-компонента.Этот метод вызывается через конструктор.Теперь добавьте объект этого бобового класса в ObservableList.Список наблюдаемых обновляется автоматически при срабатывании медиаинформации.Теперь я могу визуализировать представление таблицы, используя ObservableList и метод table.refresh (), я могу обновить данные таблицы при возникновении события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...