Diskuze: Detekování dohrání skladby v musicPlayer (v JavaFX)
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, stačily mi 3 vteřiny na googlu...
http://stackoverflow.com/a/11601256
Výtřžek z odkazu na kód řešení
final MediaPlayer nextPlayer = players.get((i + 1) % players.size());
player.setOnEndOfMedia(new Runnable() {
@Override public void run() {
player.currentTimeProperty().removeListener(progressChangeListener);
player.getMedia().getMetadata().removeListener(metadataChangeListener);
player.stop();
mediaView.setMediaPlayer(nextPlayer);
nextPlayer.play();
}
});
Neporadil by jsi mi prosím, jak to zaimplementovat do mého existujícího kódu? Nejsem zas tak dobrý...
No až sem nějaký zdrojový kód hodíš, tak uvidím, co se dá dělat
Programuji počítadlo, s odpočtem 5 minut. Celou tu metodu "handlespustitCasButtonAction", který detekuje zmáčknutí tlačítka bych potřeboval nahradit detekováním, zda-li ten "goalSong1" již dohrál...
private int countDownSeconds = 4; // bude se odpočítávat od 3 do -1
private StringProperty countDownValue = new SimpleStringProperty(countDownSeconds + "");
@FXML
private void handlespustitCasButtonAction(ActionEvent event)
{
countdownLabel.setVisible(true);
startSequenceSPlay();
startButton.setVisible(false);
zadatOsobyButton.setVisible(false);
countDownValue.setValue("3");
Timeline countdown = new Timeline(new KeyFrame(Duration.seconds(1), (e) -> {
int i = Integer.parseInt(countDownValue.getValue()) - 1;
countDownValue.setValue(i + "");
if (i == 0)
{
int s = Integer.parseInt(casSekundyValue.getValue());
int m = Integer.parseInt(casMinutyValue.getValue());
if(s <= 33 && m == 0)
{
countdownSPlay();
}
countdownLabel.setVisible(false);
startTimeLine();
enableGoalButtons();
}
if (i == -1)
{
startSequenceSStop();
}
}));
countdown.setCycleCount(countDownSeconds);
countdown.play();
spustitCasButton.setDisable(true);
goalSongStop();
}
String musicFilecountdown = "countdown.wav";
Media sound = new Media(new File(musicFilecountdown).toURI().toString());
MediaPlayer countdownSong = new MediaPlayer(sound);
public void goalSongPlay()
{
goalSong1.play();
}
// pokud je toto kód kontroleru, tak to narvi někam do metody initializable (nebo jak se to jmenuje)
countdownSong .setOnEndOfMedia(new Runnable() {
@Override public void run() {
// obsah metody handlespustitCasButtonAction
}
});
Zdravím, mám ještě jeden takový malý dotaz k MusicPlayeru.
Vytvořil jsem si databázi, který náhodně vybere jednu ze dvou skladeb v
ní.
Ovšem jenom jednou, na úplném začátku programu, to znamená že kdykoliv tu
skladbu pustím, již se náhodně nevybere, ale hraje pořád stejná, protože
se vybrala jednorázově.
A také zároveň ji stále potřebuji testovat, zda neskončila.
Zde je kód:
String databaze[] = {"Avicii - Levels.wav", "Avicii - Wake Me Up.wav"};
String musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
Media sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
MediaPlayer goalSong = new MediaPlayer(sound7);
public void goalSongPlay()
{
goalSong.play();
}
public void goalSongStop()
{
goalSong.stop();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
goalSong.setOnEndOfMedia(new Runnable() {
@Override public void run() {
odpocet321();
}
});
}
Poradíš mi tedy prosím, jak to mám udělat, že před každým zahráním písničky se náhodně vybere jedna...
Ta samá píšnička ti hraje kvůli tomuto řádku:
String musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
Media sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
MediaPlayer goalSong = new MediaPlayer(sound7);
Zde napevno nastavíš, název písničky. Cílem tedy bude toto nastavení udělat dynamicky.
Přepoklám, že tu skladbu pouštíš po stisku nějakáho tlačítka. V nejjednodušším případě přidáš do obslužné metody něco jako toto:
musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
goalSong = new MediaPlayer(sound7);
a všechno by mělo fungovat tak, jak si představuješ.
Když jsem to přidal do metody spouštění písničky...
String databaze[] = {"Avicii - Levels.wav", "Avicii - Wake Me Up.wav"};
String musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
Media sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
MediaPlayer goalSong = new MediaPlayer(sound7);
public void goalSongPlay()
{
musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
goalSong = new MediaPlayer(sound7);
goalSong.play();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
goalSong.setOnEndOfMedia(new Runnable() {
@Override public void run() {
countdown321();
System.out.println("ted");
}
});
}
již se nespustilo detekování, když písnička dohraje...
Když jsem si ale přidal tlačítko, které dělalo to samé, co se dělo po
dohrání písničky, tak se ta písnička vybírala náhodně při každém
spuštění
Ovšem nevím jak udělat, aby to detekování konce zase fungovalo
Problém je jasny, v tom tlačítku vytváříš nové instance třídy MediaPlayer, která neví, že má nějak reagovat po skončení přehrávání. Vypadá to, že vůbec nechápeš, jak to všechno vlastně funguje...
public void goalSongPlay()
{
musicFileGoalSong = databaze[(int)(Math.random()*databaze.length)];
sound7 = new Media(new File(musicFileGoalSong).toURI().toString());
goalSong = new MediaPlayer(sound7);
goalSong.setOnEndOfMedia(new Runnable() {
@Override public void run() {
countdown321();
System.out.println("ted");
}
});
goalSong.play();
}
Ale už z toho začíná být celkem slušná šílenost. Nepřemýšlel jsi někdy o nějaké vícevrstvé architektuře?
Zobrazeno 12 zpráv z 12.