2016-12-12 118 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