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.


Zobrazeno 12 zpráv z 12.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.