Java - Javafx Media Player – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Java - Javafx Media Player – Java – Fórum – Programujte.comJava - Javafx Media Player – Java – Fórum – Programujte.com

 

Michal
~ Anonymní uživatel
683 příspěvků
21. 1. 2017   #1
-
0
-

Dobrý den,

Přehrávám hudbu pomocí tohoto kódu.

new JFXPanel();
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Cat", "mp3", "wav"));
fileChooser.showOpenDialog(null);
String musicFile = fileChooser.getSelectedFile().getAbsolutePath();
Media hit = new Media(new File(musicFile).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(hit);
mediaPlayer.play();

Teď ale potřebuji, aby se při dohrání skladby celý kód opakoval.

Jenže vůbec nevím, jak bych měl detekovat, že skladba dohrála.

Prosím o radu.

Předem díky.

Nahlásit jako SPAM
IP: 185.137.19.–
gna
~ Anonymní uživatel
1853 příspěvků
21. 1. 2017   #2
-
0
-
Nahlásit jako SPAM
IP: 213.211.51.–
Michal
~ Anonymní uživatel
683 příspěvků
22. 1. 2017   #3
-
0
-

#2 gna

Díky. Jenže naskytl se další problém, SetOnEndOfMedia funguje správně, ale pouze jednou. Potřebuji to upravit tak, aby se to volalo neustále.

import java.io.File;
import javafx.embed.swing.JFXPanel;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Player {

    static MediaPlayer mediaPlayer;

    public static void main(String[] args) {
        play();
        mediaPlayer.setOnEndOfMedia(() -> {
            play();
        });
    }

    private static void play() {
        new JFXPanel();
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileNameExtensionFilter("Cat", "mp3", "wav"));
        fileChooser.showOpenDialog(null);
        String musicFile = fileChooser.getSelectedFile().getAbsolutePath();
        Media hit = new Media(new File(musicFile).toURI().toString());
        mediaPlayer = new MediaPlayer(hit);
        mediaPlayer.play();
    }
}

Nahlásit jako SPAM
IP: 185.137.18.–
gna
~ Anonymní uživatel
1853 příspěvků
23. 1. 2017   #4
-
0
-

Protože jen tomu prvnímu playeru nastavuješ ten handler.

Nahlásit jako SPAM
IP: 213.211.51.–
Michal
~ Anonymní uživatel
683 příspěvků
23. 1. 2017   #5
-
0
-

#4 gna

Ano. Velice vtipné. Ne. Konec srandy. Já vím, proč se to zavolá pouze jednou. Když to napíšu takhle, tak se to znovu zavolá dvakrát.

import java.io.File;
import javafx.embed.swing.JFXPanel;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Player {

    static MediaPlayer mediaPlayer;

    public static void main(String[] args) {
        play();
        mediaPlayer.setOnEndOfMedia(() -> {
            play();
            mediaPlayer.setOnEndOfMedia(() -> {
                play();

            });
        });
    }

    private static void play() {
        new JFXPanel();
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileNameExtensionFilter("Cat", "mp3", "wav"));
        fileChooser.showOpenDialog(null);
        String musicFile = fileChooser.getSelectedFile().getAbsolutePath();
        Media hit = new Media(new File(musicFile).toURI().toString());
        mediaPlayer = new MediaPlayer(hit);
        mediaPlayer.play();
    }
}

Jenže tenhle způsob je nesmysl a i kdybych to vnořil kolikrát chtěl, tak bych vždycky stejně dospěl do bodu, kdy by se to znova nezavolalo.

Právě proto bych byl rád, kdybys mně poradil, jak to mám napsat. Pravděpodobně bych vytvořil vevnitř vlákno, které by to kontrolovalo. Jenže nevím jak.

Předem díky.

Nahlásit jako SPAM
IP: 185.137.18.–
gna
~ Anonymní uživatel
1853 příspěvků
23. 1. 2017   #6
-
0
-

Cože?

private static void play() {
	...
	mediaPlayer = new MediaPlayer(hit);
	mediaPlayer.setOnEndOfMedia(() -> { play(); });
	mediaPlayer.play();
}
Nahlásit jako SPAM
IP: 213.211.51.–
Michal
~ Anonymní uživatel
683 příspěvků
23. 1. 2017   #7
-
0
-

#6 gna

Nevím, co myslíš tím cože? Každopádně díky a už jsem na to taky přišel, akorát nevím proč máš poslední dva řádky takhle?

mediaPlayer.setOnEndOfMedia(() -> play());

mediaPlayer.play();

Já jsem je napsal obráceně.

Každopádně bez ohledu na to, jak jsou tyto dva řádky seřazené, to funguje správně, ale NetBeans vyhodí chybu.

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at archivator.Player.play(Player.java:24)
    at archivator.Player.lambda$play$0(Player.java:27)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)

A to je taky poslední věc, s kterou bych chtěl poradit.

Díky.

Nahlásit jako SPAM
IP: 185.137.18.–
gna
~ Anonymní uživatel
1853 příspěvků
23. 1. 2017   #8
-
0
-

Cože byla reakce na nesmyslnost toho, co jsi napsal.

Handler události při přehrávání nastavuju před spuštěním přehrávání. Připadá mi to normální, nejsme v JavaScriptu.

Nevím, co tam máš null. Tipl bych, že jsi při výběru souboru nic nevybral.

Nahlásit jako SPAM
IP: 213.211.51.–
Michal
~ Anonymní uživatel
683 příspěvků
23. 1. 2017   #9
-
0
-

#8 gna

Aha. Máš pravdu. Hází to, když stornuju výběr souboru, takže to funguje správně.

Díky.

Nahlásit jako SPAM
IP: 185.137.18.–
Michal
~ Anonymní uživatel
683 příspěvků
24. 1. 2017   #10
-
0
-

#9 Michal

Ještě poslední otázka, jde nějak změnit jfilechooser, aby si nemohl kliknout na storno nebo ho zavřít, aby nedošlo k té chybě

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException...

Nahlásit jako SPAM
IP: 185.137.18.–
Michal
~ Anonymní uživatel
683 příspěvků
24. 1. 2017   #11
-
0
-

#8 gna

#9 - omylem jsem odpověděl na svůj vlastní komentář.

Nahlásit jako SPAM
IP: 185.137.18.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Media player 11 — založil Matej Zabsky

C# media player — založil Václav

Py media, prehravanie — založil stanke

LightScribe - média — založil yaqwsx

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý