2012-02-24 3 views
0

Я создал панель управления/панель меню/медиаплеер, которая откроет исходный MP3, но когда я перехожу к изменению с одной дорожки на другую, через объект FileChooser сохраняет тот же MP3 на панели управления.Java FX - Воспроизвести новый трек с помощью выбора FileChooser

Если я делаю mp.stop(), а затем устанавливаю новый носитель для mp и делаю mp.play(), он будет воспроизводить новый трек, но он не будет контролироваться должным образом.

Ниже приведены два моих текущих классов:

package gc.mediaplayer; 

import java.io.File; 
import java.net.MalformedURLException; 
import javafx.application.Application; 
import javafx.beans.property.ReadOnlyDoubleProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.stage.FileChooser; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class GCMediaPlayer extends Application { 

    MediaPlayer tracks; 
    MediaControl gcMediaPlayerControl; 
    Label mp3Info; 
    private ChangeListener<Duration> progressChangeListener; 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("GC-MediaPlayer"); 

     Group root = new Group(); 
     Scene scene = new Scene(root, 1024, 768); 

     File mp3File = new File("D:\\Selena.mp3"); 
     String initURL = null; 
     try { 
      initURL = mp3File.toURL().toExternalForm(); 
     } catch (MalformedURLException ex) { 
      System.out.println("Malformed URL Exception"); 
     } 
     System.out.println(initURL); 
     Media initMedia = new Media(initURL); 
     tracks = new MediaPlayer(initMedia); 
     setMediaControl(tracks); 
     System.out.println("Set first track"); 

     BorderPane border = new BorderPane(); 
     mp3Info = new Label("TEST"); 
     MenuBar menuBar = buildMenuBarWithMenus(primaryStage.widthProperty(), scene); 

     border.setTop(menuBar); 
     border.setCenter(mp3Info); 
     border.setBottom(gcMediaPlayerControl); 
     System.out.println("Printing Border"); 

     root.getChildren().add(border); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void setMediaControl(MediaPlayer mp3Player) 
    { 
     System.out.println("Setting Media Viewer"); 
     gcMediaPlayerControl = new MediaControl(mp3Player); 
    } 

    private MenuBar buildMenuBarWithMenus(final ReadOnlyDoubleProperty menuWidthProperty, final Scene rootScene) 
    { 
     final MenuBar menuBar= new MenuBar(); 

     final Menu menu1 = new Menu("File"); 

     MenuItem openFile = new MenuItem("Open File"); 
     openFile.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent e) { 
       FileChooser fc = new FileChooser();   
       fc.setInitialDirectory(new File("C:\\")); 
       File result = fc.showOpenDialog(rootScene.getWindow()); 

       if(result != null) 
       { 
        try { 
         String mp3FilePath = result.toURL().toExternalForm(); 
         mp3FilePath = mp3FilePath.replaceAll(" ","%20"); 
         Media mediaFile = new Media(mp3FilePath); 
         System.out.println("Got New Track"); 
         System.out.println("Track DIR: "+mp3FilePath); 
         setNewTrack(mediaFile); 
        } catch (MalformedURLException ex) { 
         System.out.println("Malformed URL Exception"); 
        } 
       } 
      } 
    }); 
     menu1.getItems().add(openFile); 
     menuBar.getMenus().add(menu1); 

     final Menu menu2 = new Menu("Options"); 
     menuBar.getMenus().add(menu2); 

     final Menu menu3 = new Menu("Help"); 
     menuBar.getMenus().add(menu3); 

     menuBar.prefWidthProperty().bind(menuWidthProperty); 

     return menuBar; 
    } 

    private void setNewTrack(Media mediaObjFile) 
    { 
     System.out.println("Stopping Old Media First"); 
     tracks.stop(); 
     System.out.println("Setting New Track"); 
     tracks = new MediaPlayer(mediaObjFile); 
     setMediaControl(tracks); 
    } 
} 

класс MediaControl, который я в настоящее время с помощью:

http://docs.oracle.com/javafx/2.0/media/playercontrol.htm

Вы видите все, что не сетка? Я, наверное, просто смотрю что-то простое.

Благодаря Матф

ответ

0

Вы используете Java в C++. Java не имеет ссылок, только указатели, поэтому присвоение gcMediaPlayerControl нового значения ничего не изменит на сцене.

Более подробно: следующая строка в коде добавляет медиа-плеер к сцене:

border.setBottom(gcMediaPlayerControl); 

добавляет один конкретный объект сцены.

Ваш метод setMediaControl изменяет переменную в классе. Это ничего не меняет в сцене.

private void setMediaControl(MediaPlayer mp3Player) 
{ 
    System.out.println("Setting Media Viewer"); 
    gcMediaPlayerControl = new MediaControl(mp3Player); 
} 

Решение:

private void setMediaControl(MediaPlayer mp3Player) 
{ 
    System.out.println("Setting Media Viewer"); 
    gcMediaPlayerControl = new MediaControl(mp3Player); 
    border.setBottom(gcMediaPlayerControl); 
} 
+0

Сергей, спасибо за быстрое напоминание. Что-то настолько простое, что я продолжал проглядывать мимо. Цените помощь. –

Смежные вопросы