2016-12-12 85 views
2

为什么此程序不能播放音乐?我正在尝试使用JavaFX创建应用程序,以允许用户播放他想播放的任何mp3文件。但它根本不起作用!为什么? 它绝对没有错误!Javafx媒体类不工作

Side note: Fix any grammar mistakes if found

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); 
} 
} 

编辑:不再出现)由于@fabian的帮助下,我更换了一些代码。但现在我得到错误:

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)

编辑2:我做了一些研究,并更换一些代码。现在唯一发生的事情是没有音乐播放和应用程序结束运行。 我在做什么错误?为什么没有人帮忙?

+0

基本上,你希望你的程序首先检查文件是否存在,它只能打开MP3文件? –

+0

@BoHalim是这是我正在制作的应用程序的测试人员。当这个工作,我可以做出适当的图形用户界 –

+0

'new Media(“file:///”+ fileList.get(0).getName());'呃...最好不要...文件名可以包含在URL中无效的字符,BTW 'File'类已经包含了一个将'File'转换为url的方法:'file.toURI()。toURL()',后面跟着'.toExternalForm()',需要一个'String'。 – fabian

回答

0

我想通了这个问题出了什么问题。非常愚蠢。

我不得不在MediaPlayer添加到MediaView进入GUI