【问题标题】:Java FX - Play new track via FileChooser SelectionJava FX - 通过 FileChooser 选择播放新曲目
【发布时间】:2012-02-24 22:04:34
【问题描述】:

我创建了一个控制栏/菜单栏/媒体播放器,它将打开一个初始 MP3,但是当我通过 FileChooser 对象从一个曲目更改为下一个曲目时,它会在控制栏上保留相同的 MP3。

如果我执行 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

你有没有看到任何不网格化的东西?我可能只是在看一些简单的东西。

谢谢 -马特

【问题讨论】:

    标签: java mp3 media-player javafx


    【解决方案1】:

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

    【讨论】:

    • 谢尔盖,感谢您的快速提醒。如此简单的事情,我一直在看过去。感谢您的帮助。
    猜你喜欢
    • 2019-03-28
    • 2013-10-21
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多