कैसे प्राप्त करने के लिए गीत की अवधि में काम करने के लिए 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();
    }
    
}

मैं पढ़ने की कोशिश की है Oracle दस्तावेज़ (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 नमूदार हैं, और तो आप चाहिए या तो जोड़ने के श्रोताओं के लिए उन्हें, या बाँध यूआई गुण के लिए उन्हें. यहाँ एक उदाहरण के बंधन ProgressBar's प्रगति करने के लिए संपत्ति के खिलाड़ी:

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

ऊपर का उपयोग करता है बाइंडिंग#createDoubleBinding(प्रतिदेय,नमूदार...) और लैम्ब्डा का भाव.

आप की आवश्यकता होगी ऐसा करने के लिए उपरोक्त हर बार एक नया MediaPlayer बनाया है, लेकिन अन्यथा संभाल लेंगे कि ध्यान में रखते हुए प्रगति बार अप करने की तारीख. और आप क्या कर सकते हैं कुछ इसी तरह के लिए लेबल प्रदर्शित करने के लिए, उदाहरण के लिए, वर्तमान समय और कुल समय में एक मानव पठनीय प्रारूप में है.

इसके अलावा, जोड़ने के बजाय एक श्रोता के लिए अपने volumeSlider आप कर सकते हैं:

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

देखें JavaFX का उपयोग करते हुए गुण और बाध्यकारी अधिक जानकारी के लिए.


एक अलग रूप में, न केवल आप का उपयोग नहीं करना चाहिए Timer यहाँ है, लेकिन जिस तरह से आप का उपयोग कर रहे हैं यह गलत है । में JavaFX, वहाँ है एक विशेष धागे का नाम JavaFX आवेदन धागा. केवल उस धागे के साथ बातचीत करनी चाहिए यूआई, सीधे या परोक्ष रूप से. का उपयोग कर किसी भी अन्य धागे के साथ बातचीत करने के लिए यूआई टूट गया है कोड और नेतृत्व कर सकते हैं के लिए अपरिभाषित व्यवहार—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ý
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में