JavaFX Video in Jpanel

neridonk

Mitglied
Hi ich versuche gerade es hinzubekommen in ein Jpanel ein video abzuspielen :

komem nur soweit :

Java:
import java.awt.EventQueue;



public class introchose {

	private JFrame frame;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					introchose window = new introchose();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public introchose() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 582, 514);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JLayeredPane layeredPane = new JLayeredPane();
		GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
		groupLayout.setHorizontalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addGap(21)
					.addComponent(layeredPane, GroupLayout.PREFERRED_SIZE, 521, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(24, Short.MAX_VALUE))
		);
		groupLayout.setVerticalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addGap(43)
					.addComponent(layeredPane, GroupLayout.DEFAULT_SIZE, 422, Short.MAX_VALUE)
					.addContainerGap())
		);
		
        final JFXPanel fxPanel = new JFXPanel();
        fxPanel.setBounds(23, 11, 488, 344);
        layeredPane.add(fxPanel);
        frame.setVisible(true);
		
		
		JButton btnStart = new JButton("start");
		btnStart.addActionListener(new ActionListener() {
			@SuppressWarnings("deprecation")
			public void actionPerformed(ActionEvent arg0) {

			
				 
				    String workingDir = System.getProperty("user.dir");
				    final File f = new File(workingDir, "media/meinvideo.mp4");
				    
				    final Media m = new Media(f.toURI().toString());
				    final MediaPlayer mp = new MediaPlayer(m);
				    final MediaView mv = new MediaView(mp);
				    
				    final DoubleProperty width = mv.fitWidthProperty();
				    final DoubleProperty height = mv.fitHeightProperty();

				    width.bind(Bindings.selectDouble(mv.sceneProperty(), "width"));
				    height.bind(Bindings.selectDouble(mv.sceneProperty(), "height"));
				    
				 
				    
				    StackPane root = new StackPane();
				    root.getChildren().add(mv);
			
			
				 
				    
				    final Scene scene = new Scene(root, 488, 344);


				    
				    fxPanel.setScene(scene);
				
				   
				 
				    
				    mp.play();
			        
				    
					
			}
		});
		btnStart.setBounds(227, 388, 89, 23);
		layeredPane.add(btnStart);
		frame.getContentPane().setLayout(groupLayout);
		
		
		
		 
   
		
		
		
	}
}


läuft aber nicht:rtfm:😱
 
Boah keine Ahnung - aber zwei Ideen:
1) Existiert das File?
2) JavaFX-UI-Thread - führe von AWT/Swing aus am besten alle Operationen auf JavaFX mittels der Klasse Platform aus dem JavaFX-Namespace aus: [c]Platform.runLater(Runnable)[/c]. FX und Swing laufen auf unterschiedlichen UI-Threads. Nur unter SWT würde es gehen, direkt FX-Komponenten zu verändern, weil sie eben auf dem selben Hauptthread laufen.
 
super lag am Thread-ing

habs so gelöst:

Auruf :

Java:
	String workingDir = System.getProperty("user.dir");
				  final File f = new File(workingDir, "media/meinVideo.mp4");
				VideoLoader vid = new VideoLoader(f);


Klasse :
Java:
import java.io.File;

import javax.swing.JPanel;

import com.sun.javafx.application.PlatformImpl;

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
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 javafx.scene.paint.Color;
import javafx.stage.Stage;

public class VideoLoader extends JPanel implements Runnable {

/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
Media media;
MediaPlayer player;
MediaView view;
JFXPanel jfxPanel;
Dimension d;
DoubleProperty width;
DoubleProperty height;
Group root;

public VideoLoader(File file) {

 
    media = new Media(file.toURI().toString());

    jfxPanel = new JFXPanel();

    playAndLoopVideo();

}

private void player() {

    root = new Group();

    player = new MediaPlayer(media);
    player.play();
    player.setMute(true);
    view = new MediaView(player);

    DoubleProperty width = view.fitWidthProperty();
    DoubleProperty height = view.fitHeightProperty();

    width.bind(Bindings.selectDouble(view.sceneProperty(), "width"));
    height.bind(Bindings.selectDouble(view.sceneProperty(), "height"));

    view.setPreserveRatio(true);
    root.getChildren().add(view);
    player.setOnEndOfMedia(this);

    PlatformImpl.runLater(
            new Runnable() {
                @Override
                public void run() {
                    Scene scene = new Scene(root, 388,144);
                    introchose.fxPanel.setScene(scene);
                }
            });

  
}

@Override
public void run() {
    player.stop();
    player();
}
}
 
Ok, schön. Das nächste mal aber am besten noch den StackTrace - oder wenigstens das letzte "Caused By" mitliefern, dann ist es nicht nur Rätselraten, in Ordnung?

Grüsse,
Daniel
 

Neue Themen


Zurück
Oben