ยังจะได้เพลงช่วงเวลาต้องทำงานอยู่ใน JavaFx โปรแกรมเล่นดนตรี name

0

คำถาม

ฉันต้องสร้างโปรแกรมเล่นดนตรี name ใช้ 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());
        }
    }

นี่คือรหัสสร้างโปรแกรมเล่นดนตรี name:

    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 เป็น observable และดังนั้นคุณจึงไม่ควรเหมือนกัเพิ่ม listeners กับพวกเขาหรือให้พวกที่ส่วนติดต่อผู้ใช้คุณสมบัติของพวกเขา นี่เป็นตัวอย่างของเชื่อมระหว่าง ProgressBar's ความคืบหน้าบ้านที่เครื่องเล่น:

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

ที่อยู่เหนือทำให้ใช้ของ Bindings#createDoubleBinding(Callable,Observable...) และ lambda แสดง.

คุณจะต้องทำอยู่เหนือทุกครั้งใหม่ MediaPlayer คือสร้างขึ้นแต่ไม่อย่างนั้นที่จะจัดการเก็บความคืบหน้าแทนฉันไปเดทด้วย และคุณสามารถทำบางอย่างที่คล้ายกันเพื่อแสดงแถบป้ายสำหรับตัวอย่างในเวลาปัจจุบันและเวลารวมในมนุษย์สามารถอ่านรูปแบบ

แล้วแทนที่จะเพิ่มเป็นผู้ฟังที่ต้องของคุณ volumeSlider คุณคือจัสติสลีกออฟอเมริกา

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

เห็น การใช้ JavaFX คุณสมบัติและถูกเชื่อมโยง เพื่อรายละเอียดที่มากกว่านี้


ที่นอกเหนือไม่ใช่แค่คุณควรใช้ไม่ได้ Timer ที่นี่,แต่การที่คุณกำลังใช้มันไม่ถูกต้อง ใน JavaFX มันเป็นพิเศษด้ายบอกชื่อของ JavaFX องโปรแกรมเธรด. เพียงใยที่ควรจะมีปฏิสัมพันธ์กับส่วนติดต่อผู้ใช้ขอ,โดยตรงหรือ indirectly. ใช้อื่นเธรดที่มีปฏิสัมพันธ์กับส่วนติดต่อผู้ใช้ขอคือโปรแกรมที่ไม่สมบูรณ์และสามารถนำให้นิยามไม่พฤติกรรม—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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่