Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何打印媒体和样式滑块的持续时间| JavaFX_Java_Javafx_Slider - Fatal编程技术网

如何打印媒体和样式滑块的持续时间| JavaFX

如何打印媒体和样式滑块的持续时间| JavaFX,java,javafx,slider,Java,Javafx,Slider,我正在为我的大学项目制作一个音乐播放器,并且面临一些滑块的问题 以下是我想用搜索栏做的事情: 如何设置搜索滑块的样式?(-fx口音不起作用) 如何打印歌曲的总时间以及播放歌曲的当前时间 下面是我用于seekSlider的代码: package musicplayer; import java.io.File; import java.net.URL; import java.util.ResourceBundle; import javafx.beans.Observable; import

我正在为我的大学项目制作一个音乐播放器,并且面临一些滑块的问题

以下是我想用搜索栏做的事情:
  • 如何设置搜索滑块的样式?(-fx口音不起作用)
  • 如何打印歌曲的总时间以及播放歌曲的当前时间
  • 下面是我用于seekSlider的代码:

    package musicplayer;
    
    import java.io.File;
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.beans.Observable;
    import javafx.beans.binding.Bindings;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.MapChangeListener;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.Slider;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.media.Media;
    import javafx.scene.media.MediaPlayer;
    import javafx.scene.media.MediaView;
    import javafx.stage.FileChooser;
    import javafx.util.Duration;
    
    
    
    public class FXMLDocumentController implements Initializable {
    
        @FXML
        private Button playbtn;
        @FXML
        private Button pausebtn;
        @FXML
        private Button stopbtn;
        @FXML
        private Button open;
        @FXML
        private Slider seekSlider;
        @FXML
        private Slider volumeSlider;
        @FXML
        private Label durationLabel;
        @FXML
        private Label musicBox;
        @FXML
        private Label playTime;
        @FXML
        private ImageView albumCover;
        @FXML
        private ImageView playbtnimg;
    
        @FXML
        private MediaView mv; 
        private MediaPlayer mp;
        private Media me;
        Double duration;
        File selectedFile = null;
        /**
         * Initializes the controller class.
         * @param e
         */
    
        //Open button code for choosing file through FileChooser
         public void open(ActionEvent e){
    
    
            FileChooser fc = new FileChooser();
            //Extension filter for showing mp3 and m4a files
            fc.getExtensionFilters().addAll(new
            FileChooser.ExtensionFilter("MP3", "*.mp3"),new
            FileChooser.ExtensionFilter("M4A", "*.m4a"));
            selectedFile = fc.showOpenDialog(null);
    
            //If runs when user selects a file
            if(selectedFile != null){
    
            String path = selectedFile.getAbsolutePath(); //gets the path of file
            if(mp!=null) //This if works when any song is playing
            {
                mp.stop(); //Stops the currently playing music
    
                //Change the album art to default.png
                File file = new File("src/musicplayer/default.png");
                Image image = new Image(file.toURI().toString());
                albumCover.setImage(image);
            }
    
            path = path.replace("\\","/");
            me = new Media(new File(path).toURI().toString());
            mp = new MediaPlayer(me);
            mv.setMediaPlayer(mp);
            //Code for Volume Slider 
            volumeSlider.setValue(0.7 * 100);
            volumeSlider.valueProperty().addListener((Observable observable) -> {
            mp.setVolume(volumeSlider.getValue()/100);
            });
            //Code for seeking bar
    
            seekSlider.maxProperty().bind(Bindings.createDoubleBinding(
                () -> mp.getTotalDuration().toSeconds(),
                mp.totalDurationProperty()));
    
            mp.currentTimeProperty().addListener((ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) -> {
                seekSlider.setValue(newValue.toSeconds());
            });
    
            seekSlider.setOnMouseClicked((MouseEvent event) -> {
                mp.seek(Duration.seconds(seekSlider.getValue()));
            });
    
    
    
    
    
    
            mp.play(); //Plays the selected song
    
            me.getMetadata().addListener(new MapChangeListener<String, Object>() {
            @Override
            public void onChanged(Change<? extends String, ? extends Object> ch) {
              if (ch.wasAdded()) {
                handleMetadata(ch.getKey(), ch.getValueAdded());
              }
            }
    
                private void handleMetadata(String key, Object value) {        
                    if(key.equals("title")){   
                        musicBox.setText(value.toString());
                        }
                    if(key.equals("image")){
                        albumCover.setImage((Image)value);
                        }
                    }
                });
            }
        }
        public void play(ActionEvent e){
        mp.play();
        }
    
        public void pause(ActionEvent e){
        mp.pause();
        }
    
        public void stop(ActionEvent e){
        mp.stop();
        }
    
    
        @Override
        public void initialize(URL url, ResourceBundle rb) {
    
    
        }
    
    
    
    }
    
    package音乐层;
    导入java.io.File;
    导入java.net.URL;
    导入java.util.ResourceBundle;
    导入javafx.beans.Observable;
    导入javafx.beans.binding.Bindings;
    导入javafx.beans.value.observeValue;
    导入javafx.collections.MapChangeListener;
    导入javafx.event.ActionEvent;
    导入javafx.fxml.fxml;
    导入javafx.fxml.Initializable;
    导入javafx.scene.control.Button;
    导入javafx.scene.control.Label;
    导入javafx.scene.control.Slider;
    导入javafx.scene.image.image;
    导入javafx.scene.image.ImageView;
    导入javafx.scene.input.MouseEvent;
    导入javafx.scene.media.media;
    导入javafx.scene.media.MediaPlayer;
    导入javafx.scene.media.MediaView;
    导入javafx.stage.FileChooser;
    导入javafx.util.Duration;
    公共类FXMLDocumentController实现可初始化{
    @FXML
    私人按钮播放;
    @FXML
    专用按钮pausebtn;
    @FXML
    专用按钮stopbtn;
    @FXML
    私人按钮打开;
    @FXML
    私人滑杆式滑翔机;
    @FXML
    私人滑杆滑杆;
    @FXML
    自有品牌durationLabel;
    @FXML
    自有品牌音乐盒;
    @FXML
    自有品牌游戏时间;
    @FXML
    私人影集封面;
    @FXML
    私有图像视图playbtnimg;
    @FXML
    私有MediaView mv;
    私人媒体播放器;
    私人媒体我;
    双倍持续时间;
    文件selectedFile=null;
    /**
    *初始化控制器类。
    *@param e
    */
    //通过文件选择器选择文件的打开按钮代码
    公开作废打开(ActionEvent e){
    FileChooser fc=新建FileChooser();
    //用于显示mp3和m4a文件的扩展筛选器
    fc.getExtensionFilters().addAll(新
    FileChooser.ExtensionFilter(“MP3”和“*.MP3”),新增
    FileChooser.ExtensionFilter(“M4A”,“*.M4A”);
    selectedFile=fc.showOpenDialog(空);
    //如果在用户选择文件时运行
    如果(selectedFile!=null){
    String path=selectedFile.getAbsolutePath();//获取文件的路径
    if(mp!=null)//当播放任何歌曲时,此if工作
    {
    mp.stop();//停止当前播放的音乐
    //将相册艺术更改为default.png
    File File=新文件(“src/musicplayer/default.png”);
    Image Image=新图像(file.toURI().toString());
    相册封面。设置图像(图像);
    }
    路径=路径。替换(“\\”,“/”;
    me=新媒体(新文件(路径).toURI().toString());
    mp=新媒体播放器(me);
    mv.setMediaPlayer(mp);
    //音量滑块代码
    体积滑块设定值(0.7*100);
    volumeSlider.valueProperty().addListener((可观察)->{
    mp.setVolume(volumeSlider.getValue()/100);
    });
    //搜索栏代码
    seekSlider.maxProperty().bind(Bindings.createDoubleBinding(
    ()->mp.getTotalDuration().toSeconds(),
    mp.totalDurationProperty());
    
    mp.currentTimeProperty().addListener((ObservalEvalue您可以创建一个标签,并将其文本属性绑定到一个绑定,该绑定用于格式化MediaPlayer的当前时间:

    Label timeLabel = new Label();
    timeLabel.textProperty().bind(
        Bindings.createStringBinding(() -> {
                Duration time = mp.getCurrentTime();
                return String.format("%4d:%02d:%04.1f",
                    (int) time.toHours(),
                    (int) time.toMinutes() % 60,
                    time.toSeconds() % 3600);
            },
            mp.currentTimeProperty()));
    
    请注意,您不应收听鼠标输入,因为可以通过键盘和屏幕触摸操作控件。最好收听value属性:

    Slider seekSlider = new Slider(0, 1, 0);
    seekSlider.maxProperty().bind(
        Bindings.createDoubleBinding(
            () -> mp.getTotalDuration().toSeconds(),
            mp.totalDurationProperty()));
    
    mp.currentTimeProperty().addListener((observable, oldValue, newValue) -> {
        seekSlider.setValue(newValue.toSeconds());
    });
    
    seekSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
        mp.seek(Duration.seconds(newValue.doubleValue()));
    });
    
    请注意,MediaPlayer的某些属性在首次构造时可能没有意义,因为它在后台加载媒体。例如,的初始值可能是Duration.UNKNOWN

    您可以通过将依赖于MediaPlayer的所有代码移动到可运行文件中,并将该可运行文件传递给:


    首先,用
    seekSlider.valueProperty().addListener
    替换seekSlider.setonmouseClacked。滑块由多个鼠标单击控制。@VGR您能给我完整的代码吗?当我将您的代码用于侦听器时,歌曲无法正常播放。是否需要使用:slider seekSlider=新滑块(0,1,0);实际上,您可以使用任何滑块构造函数,只要允许最小值的默认值为零。您能提供比“不再正常播放”更详细的信息吗?你在看什么?你是在播放视频还是音频?我只是在播放音频?你能提供邮件id、fb id或其他信息,以便我向你发送代码,我们可以通过“不再正常播放”联系你我的意思是,每当我加载一首歌曲,以前它一打开就开始播放,但在使用代码后,它不会播放,每当我一直拖动滑块,它就会播放歌曲中鼠标放在滑块上的部分。一旦我卸下鼠标,它就会停止。您使用它来初始化滑块和标签,仅当媒体启动时他们的财产是已知的,对吗?
    Label timeLabel = new Label();
    Slider seekSlider = new Slider();
    
    mp.setOnReady(() -> {
        timeLabel.textProperty().bind(
            Bindings.createStringBinding(() -> {
                    Duration time = mp.getCurrentTime();
                    return String.format("%4d:%02d:%04.1f",
                        (int) time.toHours(),
                        (int) time.toMinutes() % 60,
                        time.toSeconds() % 3600);
                },
                mp.currentTimeProperty()));
    
        seekSlider.maxProperty().bind(
            Bindings.createDoubleBinding(
                () -> mp.getTotalDuration().toSeconds(),
                mp.totalDurationProperty()));
    
        mp.currentTimeProperty().addListener((observable, oldValue, newValue) -> {
            seekSlider.setValue(newValue.toSeconds());
        });
    
        seekSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
            mp.seek(Duration.seconds(newValue.doubleValue()));
        });
    });