Fehler beim mp4-datei aufrufen, nach dem zweiten aufruf

hubmar

Neues Mitglied
Hallo, ich probiere gerade ein Video aufzufrufen und per Button wieder zu schließen. Wenn ich das Video das erste mal Aufrufe funktioniert auch alles wie es sollte, allerdings sobald ich das Fenster einmal per Button geschlossen habe und das video neu aufrufen möchte wird nur noch der Button angezeigt und das Video spielt nicht mehr ab. Ich habe keine Ahnung woran das liegen könnte oder wie ich es lösen kann. Wenn irgendwer anrgungen hat oder weiß woran es liegen könnte, wäre ich sehr dankbar. Hier wäre noch mein bisheriger Code:
Java:
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javax.swing.*;
import java.awt.*;
import java.io.File;
public class VideoOpener {
    private static JDialog videoDialog;
    private static MediaPlayer mediaPlayer;
    private static JFXPanel jfxPanel;
    public static void main(String[] args) {
        // Initialisiere JavaFX im Swing-Thread
        SwingUtilities.invokeLater(() -> {
            new JFXPanel(); // Initialisiert JavaFX (damit der JavaFX-Thread startet)
            playVideo();    // Startet das Video nach der Initialisierung
        });
    }
    public static void playVideo() {
        // Erstelle das JDialog für das Video
        videoDialog = new JDialog((Frame) null, "Video", true);
        videoDialog.setUndecorated(true);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        videoDialog.setSize(screenSize.width, screenSize.height); // Setzt das Fenster auf Vollbild
        videoDialog.setLocation(0, 0); // Positioniert das Fenster oben links
        JPanel videoPanel = new JPanel(new BorderLayout());
        jfxPanel = new JFXPanel(); // JFXPanel für JavaFX
        videoPanel.add(jfxPanel, BorderLayout.CENTER);
        // Schließen-Button (Fenster schließen)
        JButton closeButton = new JButton("Schließen");
        closeButton.addActionListener(e -> {
            stopVideo();  // Stoppt das Video
            videoDialog.dispose(); // Schließt das Dialog-Fenster
            Platform.exit();  // Beendet den JavaFX-Thread
        });
        // Setze den Button unten im JPanel
        videoPanel.add(closeButton, BorderLayout.SOUTH);
        // Lade und starte das Video im JavaFX-Thread
        Platform.runLater(() -> {
            File videoFile = new File("C:/Users/nikla/Pictures/Screenshots/Spiel/Film1.mp4");
            if (!videoFile.exists()) {
                System.err.println("Die Videodatei existiert nicht: " + videoFile.getAbsolutePath());
                return;
            }
            // Wenn der MediaPlayer bereits existiert, stoppen und freigeben
            if (mediaPlayer != null) {
                mediaPlayer.stop();
                mediaPlayer.dispose();}
            // Erstelle den neuen MediaPlayer
            Media media = new Media(videoFile.toURI().toString());
            mediaPlayer = new MediaPlayer(media);
            MediaView mediaView = new MediaView(mediaPlayer);
            mediaView.setFitWidth(screenSize.width);
            mediaView.setFitHeight(screenSize.height);
            // StackPane für das Layout
            StackPane stackPane = new StackPane();
            stackPane.getChildren().add(mediaView);
            // Setze die Scene für den JFXPanel
            Scene scene = new Scene(stackPane);
            jfxPanel.setScene(scene);
            // Spiele das Video ab
            mediaPlayer.play();
        });
        // Zeige das Video-Fenster an
        videoDialog.setContentPane(videoPanel);
        videoDialog.setVisible(true);
    }
    // Methode zum Stoppen des Videos und Freigeben des MediaPlayers
    private static void stopVideo() {
        if (mediaPlayer != null) {
            mediaPlayer.stop();
            mediaPlayer.dispose();
            mediaPlayer = null;
        }
    }
}
 
Wenn irgendwer anrgungen
Google Gemini (Flash 2.0 experimental) gibt Ausführungen welche Kombinationen an Java(FX)-Codes kritisch sein könnten und gibt folgenden Verbesserungsvorschlag

Java:
public class VideoOpener {

    private static JDialog videoDialog;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new JFXPanel(); // Initialisiert JavaFX
            videoDialog = new JDialog((Frame) null, "Video", true); // Dialog nur einmal erstellen
            videoDialog.setUndecorated(true);
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            videoDialog.setSize(screenSize.width, screenSize.height);
            videoDialog.setLocation(0, 0);
        });
        playVideo();
    }

    public static void playVideo() {
        SwingUtilities.invokeLater(() -> {
            if (videoDialog == null) {
              return;
            }
            JPanel videoPanel = new JPanel(new BorderLayout());
            JFXPanel jfxPanel = new JFXPanel(); // JFXPanel lokal
            videoPanel.add(jfxPanel, BorderLayout.CENTER);

            JButton closeButton = new JButton("Schließen");
            closeButton.addActionListener(e -> {
                stopVideo();
                videoDialog.setVisible(false); // Dialog nur ausblenden
            });
            videoPanel.add(closeButton, BorderLayout.SOUTH);

            Platform.runLater(() -> {
                File videoFile = new File("C:/Users/nikla/Pictures/Screenshots/Spiel/Film1.mp4");
                if (!videoFile.exists()) {
                    System.err.println("Die Videodatei existiert nicht: " + videoFile.getAbsolutePath());
                    return;
                }

                Media media = new Media(videoFile.toURI().toString());
                MediaPlayer mediaPlayer = new MediaPlayer(media); // MediaPlayer lokal
                MediaView mediaView = new MediaView(mediaPlayer);
                mediaView.setFitWidth(videoDialog.getWidth());
                mediaView.setFitHeight(videoDialog.getHeight());

                StackPane stackPane = new StackPane();
                stackPane.getChildren().add(mediaView);

                Scene scene = new Scene(stackPane);
                jfxPanel.setScene(scene);

                mediaPlayer.play();
            });

            videoDialog.setContentPane(videoPanel);
            videoDialog.setVisible(true);
        });
    }

    private static void stopVideo() {
        Platform.runLater(() -> {
            if (videoDialog != null && videoDialog.getContentPane() != null) {
                Component[] components = videoDialog.getContentPane().getComponents();
                for (Component component : components) {
                    if (component instanceof JFXPanel) {
                        JFXPanel jfxPanel = (JFXPanel) component;
                        if (jfxPanel.getScene() != null && jfxPanel.getScene().getRoot() != null) {
                            StackPane stackPane = (StackPane) jfxPanel.getScene().getRoot();
                            for (javafx.scene.Node node : stackPane.getChildren()) {
                                if (node instanceof MediaView) {
                                    MediaView mediaView = (MediaView) node;
                                    if (mediaView.getMediaPlayer() != null) {
                                        mediaView.getMediaPlayer().stop();
                                        mediaView.getMediaPlayer().dispose();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        });
    }
}
 

Zurück
Oben