을 얻는 방법을 노래 기간에서 작업하 JavaFx 음악 플레이어

0

질문

내가 만든 음악을 사용하여 플레이어 JavaFX. 그러나 나는지 이해할 수 있는 방법을 내가 알 수 있습니다 기간의 노래 나는 현재 재생됩니다.

편집: 가가 다음 줄을 내 코드는 이제 노래 시간을 볼 수 있습니다. 그러나 때,나는 플레이 다음 노래,노래 시간은 보이지 않습니다. 여기에 줄을 추가 코드:

mediaPlayer.currentTimeProperty().addListener(new TimeListener());  

TimeListener = new ChangeListener<Duration>() 
        {
              @Override public void changed(ObservableValue<? extends Duration> o, Duration oldVal, Duration newVal) 
              {
             //now newVal is of Duration class
              }
            };

    }
    
    public class TimeListener implements ChangeListener {
        public void changed(ObservableValue o, Object oldVal, Object newVal) {

        //Update time display with MediaPlayer's current time:
        playTime.setText(newVal.toString());
        }
    }

여기에는 나의 코드를 만들의 음악 플레이어:

    public class MusicController implements Initializable 
{
    @FXML
    private ImageView trackLogo;
    @FXML
    private Button next, previous, pause, play, reset;
    @FXML
    private Slider VolumeSlider;    
    @FXML
    private AnchorPane Panel;   
    @FXML
    private Label playTime, appTitle, songTitle;    
    @FXML
    private ProgressBar songProgressBar;
    @FXML
    private Media media;
    private MediaPlayer mediaPlayer;
    private File directory;
    private File [] files;
    private ArrayList<File> songs;  
    private int songNumber; 
    private Timer timer;
    private TimerTask task;
    private boolean running;
    private ChangeListener<Duration> TimeListener;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) 
    {
        songs = new ArrayList<File>();      
        directory = new File("music");      
        files = directory.listFiles();      
        if(files!=null) 
        {
            for(File file : files)
            {
                songs.add(file);
                System.out.println(file);
            }
        }       
        media = new Media(songs.get(songNumber).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
        mediaPlayer.currentTimeProperty().addListener(new TimeListener());      
        songTitle.setText(songs.get(songNumber).getName());
        VolumeSlider.valueProperty().addListener(new ChangeListener<Number>()
                {
                    public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) 
                    {       
                        mediaPlayer.setVolume(VolumeSlider.getValue() * 0.01);  
                    }
                });
        
        TimeListener = new ChangeListener<Duration>() 
        {
              @Override public void changed(ObservableValue<? extends Duration> o, Duration oldVal, Duration newVal) 
              {
             //now newVal is of Duration class
              }
            };

    }
    
    public class TimeListener implements ChangeListener {
        public void changed(ObservableValue o, Object oldVal, Object newVal) {

        //Update time display with MediaPlayer's current time:
        playTime.setText(newVal.toString());
        }
    }
    
    public void playMedia() 
    {   
            beginTimer();
            mediaPlayer.setVolume(VolumeSlider.getValue() * 0.01);
            mediaPlayer.play();
    }
    
    public void pauseMedia() 
    {   
            cancelTimer();
            mediaPlayer.pause();
    }

    public void resetMedia() 
    {   
            songProgressBar.setProgress(0);
            mediaPlayer.seek(Duration.seconds(0));
    }
    
    public void previousMedia() 
    {   
        if (songNumber > 0)
        {
            songNumber--;
            mediaPlayer.stop();
            
            if(running)
            {
                cancelTimer();
            }
            
            media = new Media(songs.get(songNumber).toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            songTitle.setText(songs.get(songNumber).getName());
            playMedia();

        }
        else
        {
            songNumber = songs.size() - 1;
            mediaPlayer.stop();
            
            if(running)
            {
                cancelTimer();
            }
            
            
            media = new Media(songs.get(songNumber).toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            songTitle.setText(songs.get(songNumber).getName());
            playMedia();
        }
    }
    
    public void nextMedia() 
    {   
        if (songNumber < songs.size() - 1)
        {
            songNumber++;
            mediaPlayer.stop();
            
            if(running)
            {
                cancelTimer();
            }
    
            media = new Media(songs.get(songNumber).toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            songTitle.setText(songs.get(songNumber).getName());
            playMedia();

        }
        else
        {
            songNumber = 0;
            mediaPlayer.stop();
            
            if(running)
            {
                cancelTimer();
            }
            media = new Media(songs.get(songNumber).toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            songTitle.setText(songs.get(songNumber).getName());
            playMedia();
        }
    }
    
    
    public void beginTimer() 
    {   
        timer = new Timer();
        task = new TimerTask()
                {   
                    public void run() 
                    {
                        running = true;
                        double current = mediaPlayer.getCurrentTime().toSeconds();
                        double end = media.getDuration().toSeconds();
                        System.out.println(current/end);
                        songProgressBar.setProgress(current/end);
                        
                        if (current/end ==1)
                        {
                            cancelTimer();
                        }
                        
                    }
                };
                timer.scheduleAtFixedRate(task, 0, 1000);
    }
    
    public void cancelTimer() 
    {   
            running = false;
            timer.cancel();
    }
    
}

가 읽고 오라클 문서(https://docs.oracle.com/javase/8/javafx/media-tutorial/playercontrol.htm다)및 이디(https://www.youtube.com/watch?v=-D2OIekCKes한)를 만들의 음악 플레이어입니다.

나는 감사하게 될 것이라고 어떤 도움이됩니다. 사전에 감사합니다!

java javafx scenebuilder
2021-11-23 06:16:25
1

최고의 응답

1

사용하지 않아야 합니다 Timer또는 스레드에서 일반적으로,무언가를 위해 다음과 같다. 의 속성 MediaPlayer 은 관찰할 수 있는,그래서 당신은 하나 추가하는 청취자들이나 바인딩 UI 속성습니다. 여기에는 예의 바인딩 ProgressBar의 진전 속성을 플레이어:

progressBar.progressProperty().bind(
    Bindings.createDoubleBinding(() -> {
      Duration current = mediaPlayer.getCurrentTime();
      Duration total = mediaPlayer.getCycleDuration();
      return current.toMilli() / total.toMillis();
    },
    mediaPlayer.currentTimeProperty(),
    mediaPlayer.cycleDurationProperty())
);

위의 사용 바인딩#createDoubleBinding(호출,관찰...)람다 식.

당신이해야 할 위 때마다 새로운 MediaPlayer 이 만들어지지만 그렇지 않으면을 처리할지 진행됩 up-to-date. 고 당신이 무언가를 할 수 있는 유사한 라벨을 표시하는,예를 들어,현재 시간과 총 시간은 인간에 읽을 수 있는 형식입니다.

또한 추가하는 대신 수신기의 volumeSlider 당신은 할 수 있습니다:

mediaPlayer.volumeProperty().bind(volumeSlider.valueProperty());

를 사용하여 JavaFX 속성 및 바인딩 에 대한 자세한 내용은.


옆으로,뿐만 아니라 당신은 사용하지 Timer 여기에,하지만 당신은 그것을 사용하여 잘못된 것입니다. 에 JavaFX,특별한 스레드 라는 JavaFX 스레드 응용 프로그램. 는 스레드와 상호 작용한다 UI,직접적으로 또는 간접적으로. 를 사용하여 다른 스레드와 상호 작용하 UI 이 깨지 코드를 이끌 수 있는 정의되지 않은 행동 JavaFX 지 않는 스레드에 안전합니다.

예약할 수 있습니 작업에 FX 스레드를 사용하여 Platform#runLater(Runnable).

2021-11-23 08:20:29

당신을 순전히 감사합니다. 난제를 해결하기 위해 노력할 것입 통보에서 내 프로그램입니다.
Devanshu Mahapatra

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................