如何从JavaFX Media对象获取媒体详细信息(标题,专辑等)并将详细信息添加到ObservableList?

时间:2019-01-22 14:04:08

标签: java javafx lambda

我已经创建了ArrayList个媒体文件路径,我想在JavaFX应用程序中获取媒体文件的详细信息,例如标题和专辑信息。我想在ObservableList中添加这些详细信息。因此,我创建了一个迭代器,该迭代器提供了所有媒体文件的路径。在迭代器循环内部,我创建了一个Media对象。为了从Media对象获取媒体信息,我创建了元数据事件监听器。我在lambda函数中获得了媒体信息,但是我无法在lambda函数之外使用它们。如果我在事件侦听器lambda函数的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())正在打印歌曲的标题,但在lambda函数System.out.println(playListItem.getTitle())外部则打印null。这意味着playListItem对象的值没有改变。我尝试将playListItem设置为最终版本,但没有帮助。我还尝试在lambda函数中初始化playListItem对象和playListData.add(playListItem),但是由于事件侦听器的迭代,它会插入带有许多空标题值的标题。

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

1 个答案:

答案 0 :(得分:0)

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