首页 文章

JavaFX - 插入从音频文件中检索的媒体标记后,ArrayLists将打印为空

提问于
浏览
0

我是Java编程的新手,我正在尝试开发一个可以从导入的MP3文件中检索媒体标签(例如 Headers ,艺术家......)的类,这样我就可以将它们存储在个人MySQL中数据库 .

我有这个问题,我一直试图解决几天,但我无法在网上找到解决方案 .

这是我的 class :

public class FileImportClass extends Application {

    private static final Object obj = new Object();
    private static List<File> songList;
    private static ArrayList<String> title;
    private static ArrayList<String> artist;
    private static ArrayList<Integer> year;
    private static ArrayList<String> genre;
    private static ArrayList<String> duration;
    private static ArrayList<String> album;
    private static ArrayList<String> extension;
    private static ArrayList<String> size;
    private static ObservableMap<String, Object> songTags;

    public static void FileImport(Node node){
        title = new ArrayList<>();
        artist = new ArrayList<>();
        year = new ArrayList<>();
        genre = new ArrayList<>();
        duration = new ArrayList<>();
        album = new ArrayList<>();
        extension = new ArrayList<>();
        size = new ArrayList<>();

        FileChooser fileImport = new FileChooser();
        fileImport.setTitle("Importazione di File Audio");
        fileImport.getExtensionFilters().addAll(new ExtensionFilter("MP3 Files: ", "*.mp3"));
        Stage currentStage = (Stage) node.getScene().getWindow();
        songList = fileImport.showOpenMultipleDialog(currentStage);
        if (songList.size() > 50) {
            Alert alert = new Alert(Alert.AlertType.ERROR);
            alert.setTitle("Errore!");
            alert.setHeaderText("Errore nell'inserimento dei file audio!");
            alert.setContentText("È stato superato il massimo di 50 file audio importabili alla volta.");

            alert.showAndWait(); 
            return;
        }
        else{
            for(int i = 0; i < songList.size(); i++) {
                File file = songList.get(i);
                Media mediaFile = new Media(file.toURI().toString());
                double FILE_SIZE_D = file.length();
                int FILE_SIZE_I = (int) FILE_SIZE_D;
                int FILE_SIZE = FILE_SIZE_I / 1024;
                size.add(String.valueOf(FILE_SIZE) + " kB");

                final MediaPlayer mediaPlayer = new MediaPlayer(mediaFile);
                mediaPlayer.setOnReady(new Runnable(){
                    @Override
                    public void run() {
                        songTags = mediaPlayer.getMedia().getMetadata();
                        title.add(songTags.get("title").toString());
                        artist.add(songTags.get("artist").toString());

                        double DURATA_MINUTI_D = mediaFile.getDuration().toSeconds() / 60;
                        double DURATA_MINUTI_I = (int) DURATA_MINUTI_D;
                        double DURATA_SECONDI_D = (DURATA_MINUTI_D - DURATA_MINUTI_I) * 60;
                        double DURATA_SECONDI_I = (int) DURATA_SECONDI_D;

                        duration.add(String.valueOf(DURATA_MINUTI_I) + " min " + DURATA_SECONDI_I + " s");
                        if (songTags.get("genre") != null) {
                            genre.add(songTags.get("genre").toString());
                        }
                        else {
                            genre.add("Genere sconosciuto");
                        }

                        if (songTags.get("album") != null) {
                            album.add(songTags.get("album").toString());
                        }
                        else {
                            album.add("Album sconosciuto");
                        }
                        year.add((Integer) songTags.get("year"));
                        synchronized(obj){
                            obj.notify();
                        }
                    }
                });
            }
        }
        System.out.println(title);
        System.out.println(artist);
        System.out.println(genre);
        System.out.println(size);
        System.out.println(duration);
        System.out.println(album);
        System.out.println(year);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

问题是,当我尝试打印包含Tags的ArrayLists时,它们是空的(“[]”) . 但是,如果我尝试从mediaPlayer.setOnReady()函数内部打印它们,那么它可以正常工作 .

有没有人可以帮我解决这个问题?

谢谢大家!

2 回答

  • 0

    你're adding the tags inside ' MediaPlayer.setOnReady',当 MediaPlayer 对象的状态变为 READY 时被调用 . 调用方法后但在未知时间之后不会立即发生这种情况 . 这意味着你的print语句被执行 before 状态改变事件,所以那时列表仍然是空的 .

  • 0

    正如Gnas所说,这里存在同步性问题 . 你必须做这样的事情:

    在你的循环中:

    for(int i = 0; i < songList.size(); i++) {
        final int finalI = i;
        ...
    

    在run()方法结束时:

    if (finalI == songList.size() - 1) {
        System.out.println(title);
        System.out.println(artist);
        System.out.println(genre);
        System.out.println(size);
    }
    

相关问题