Search code examples
javajavafxmedia-playermedia

Javafx Media class not working without any error


Why does this program not play music? I am trying to make an application with JavaFX to allow the user to play any MP3 file he wants to play. But it does not work at all! Why?

It gives absolutely no error!

package application;

import java.io.File;
import java.nio.file.Paths;
import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.image.Image;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

public class Start extends Application {

public void start(Stage primStage) {
    try {
        // Validation for first time start

        Alert a = new Alert(AlertType.INFORMATION);
        a.setTitle("Welcome");
        a.setHeaderText("Welcome to Orpheus!");
        a.setContentText("Welcome to Orpheus. Pick the folder in which all your music is located");

        Stage stg = (Stage) a.getDialogPane().getScene().getWindow();
        stg.getIcons().add(new Image(this.getClass().getResource("harp.png").toString()));
        primStage.getIcons().add(new Image(this.getClass().getResource("harp.png").toString()));

        a.showAndWait();

        DirectoryChooser dc = new DirectoryChooser();
        dc.setInitialDirectory(new File(System.getProperty("user.home")));
        dc.setTitle("Pick your folder!");

        File f = dc.showDialog(primStage);
        File[] fileArray = f.listFiles();
        boolean[] song = new boolean[fileArray.length];
        int j = 0;

        if (fileArray != null) {
            for (File child : fileArray) {
                String ext = "";
                int i = child.getName().lastIndexOf('.');

                if (i >= 0) {
                    ext = child.getName().substring(i+1);
                }

                if (ext.equals("mp3")) {
                    song[j] = true;
                    j++;
                } else {
                    song[j] = false;
                    j++;
                }
            }
        }

        j = 0;
        ArrayList<File> fileList = new ArrayList<>();

        for (boolean b : song) {
            if(b) {
                fileList.add(fileArray[j]);
            }
            j++;
        }

        //New codes!
        ArrayList<String> names = new ArrayList<>();

        for (File fi : fileList) {
            String tmp = fi.getCanonicalPath();
            tmp = tmp.replaceAll("\\\\", "/");
            names.add(tmp);
        }

        Media m = new Media("file:///" + names.get(0));
        MediaPlayer mp = new MediaPlayer(m);
        mp.play();

        //App ends with no sleep method for threads
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    launch(args);
}
}

But now I get error:

MediaException: MEDIA_UNAVAILABLE : \file:\C:\Users\Kaboom\Music\Closer.mp3 (The filename, directory name, or volume label syntax is incorrect) at javafx.scene.media.Media.(Media.java:407) at application.Start.start(Start.java:75) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) at java.lang.Thread.run(Unknown Source)

I did some research and replaced some code. Now the only thingy which happens is no music plays and app ends running.

What am I doing wrongly?


Solution

  • I figured out what was wrong with this problem. Very stupid it is.

    I just had to add the MediaPlayer to MediaView and into GUI