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