如何打印媒体和样式滑块的持续时间| 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
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()));
});
});