首页 > 解决方案 > 如何从 JavaFX Media 对象获取媒体详细信息(标题、专辑等)并将详细信息添加到 ObservableList?

问题描述

我已经创建了一个ArrayList媒体文件路径,我想在我的 JavaFX 应用程序中获取媒体文件的详细信息,例如标题和专辑信息。我想在ObservableList. 所以我创建了一个迭代器,它给出了所有媒体文件的路径。在迭代器循环中,我创建了一个Media对象。为了从Media对象获取媒体信息,我创建了元数据事件监听器。我在 lambda 函数中获得了媒体信息,但我无法在 lambda 函数之外使用它们。如果我ObservableList在事件侦听器 lambda 函数中添加信息而不是由于元数据迭代而插入许多空值,并且只有一个有用的信息正在插入。

这是我的代码:

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())正在打印歌曲的标题,但在 lambda 函数之外System.out.println(playListItem.getTitle())打印 null。这意味着playListItem对象的值没有改变。我尝试制作playListItem最终但无济于事。我也尝试过初始化playListItem对象和playListData.add(playListItem)内部 lambda 函数,但由于事件侦听器迭代,它插入了许多 null 标题值的标题。

我还使用局部变量进行了测试,但我无法获取侦听器 lambda 函数之外的值。

标签: javajavafxlambda

解决方案


我解决了这个问题。我的解决方案是在 bean 类的构造函数中传递 Media 对象,并在 bean 类中创建另一个方法,该方法将检索媒体信息并更新 bean 对象。该方法通过构造函数调用。现在在 ObservableList 中添加这个 bean 类的对象。触发媒体信息事件时,可观察列表会自动更新。现在我可以使用 ObservableList 并使用 table.refresh() 方法渲染 tableview,我可以在触发事件时刷新表数据。


推荐阅读