如何在swing中运行JavaFXMediaPlayer?

如何在swing中运行JavaFXMediaPlayer?,swing,user-interface,javafx-2,Swing,User Interface,Javafx 2,我为我正在开发的一个应用程序制作了一个简单的媒体播放器,问题是我认为可以简单地将JavaFX集成到Swing中。事实并非如此。我一直在寻找解决此问题的方法,并尝试使用此网站: 问题是,即使我有一个解释如何将代码组合在一起的网站,我仍然不明白如何组合。这是mediaplayer,我计划将其集成到我的Swing代码中,以便在单击按钮时调用mediaplayer。这是我为媒体播放器编写的所有代码,如果有人能分享一些关于如何将其集成到我的Swing代码(即我的GUI)中的信息,我可能不得不通过计算机亲吻

我为我正在开发的一个应用程序制作了一个简单的媒体播放器,问题是我认为可以简单地将JavaFX集成到Swing中。事实并非如此。我一直在寻找解决此问题的方法,并尝试使用此网站: 问题是,即使我有一个解释如何将代码组合在一起的网站,我仍然不明白如何组合。这是mediaplayer,我计划将其集成到我的Swing代码中,以便在单击按钮时调用mediaplayer。这是我为媒体播放器编写的所有代码,如果有人能分享一些关于如何将其集成到我的Swing代码(即我的GUI)中的信息,我可能不得不通过计算机亲吻你

public class Player extends Application{ private boolean atEndOfMedia = false; private final boolean repeat = false; private boolean stopRequested = false; private Duration duration; private Label playTime; private Slider volumeSlider; @Override public void start(final Stage stage) throws Exception { stage.setTitle("Movie Player");//set title Group root = new Group();//Group for buttons etc final Media media = new Media("file:///Users/Paul/Downloads/InBruges.mp4"); final MediaPlayer playa = new MediaPlayer(media); MediaView view = new MediaView(playa); //Slide in and out and what causes that. final Timeline slideIn = new Timeline(); final Timeline slideOut = new Timeline(); root.setOnMouseEntered(new javafx.event.EventHandler<javafx.scene.input.MouseEvent>() { @Override public void handle(MouseEvent t) { slideIn.play(); } }); root.setOnMouseExited(new javafx.event.EventHandler<javafx.scene.input.MouseEvent>() { @Override public void handle(MouseEvent t) { slideOut.play(); } }); final VBox vbox = new VBox(); final Slider slider = new Slider(); final Button playButton = new Button("|>"); root.getChildren().add(view); root.getChildren().add(vbox); vbox.getChildren().add(slider); vbox.getChildren().add(playButton); vbox.setAlignment(Pos.CENTER); Scene scene = new Scene(root, 400, 400, Color.BLACK); stage.setScene(scene); stage.show(); // Play/Pause Button playButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { Status status = playa.getStatus(); if (status == Status.UNKNOWN || status == Status.HALTED) { // don't do anything in these states return; } if ( status == Status.PAUSED || status == Status.READY || status == Status.STOPPED) { // rewind the movie if we're sitting at the end if (atEndOfMedia) { playa.seek(playa.getStartTime()); atEndOfMedia = false; } playa.play(); } else { playa.pause(); } } }); //Listeners and Shit for Play Button playa.setOnPlaying(new Runnable() { @Override public void run() { if (stopRequested) { playa.pause(); stopRequested = false; } else { playButton.setText("||"); } } }); playa.setOnPaused(new Runnable() { @Override public void run() { playButton.setText(">"); } }); playa.play(); playa.setOnReady(new Runnable() { @Override public void run(){ int v = playa.getMedia().getWidth(); int h = playa.getMedia().getHeight(); stage.setMinWidth(v); stage.setMinHeight(h); vbox.setMinSize(v, 100); vbox.setTranslateY(h-50); //slider and graphical slide in/out slider.setMin(0.0); slider.setValue(0.0); slider.setMax(playa.getTotalDuration().toSeconds()); slideOut.getKeyFrames().addAll( new KeyFrame(new Duration(0), new KeyValue(vbox.translateYProperty(), h-100), new KeyValue(vbox.opacityProperty(), 0.9) ), new KeyFrame(new Duration(300), new KeyValue(vbox.translateYProperty(), h), new KeyValue(vbox.opacityProperty(), 0.0) ) ); slideIn.getKeyFrames().addAll( new KeyFrame(new Duration(0), new KeyValue(vbox.translateYProperty(), h), new KeyValue(vbox.opacityProperty(), 0.0) ), new KeyFrame(new Duration(300), new KeyValue(vbox.translateYProperty(), h-100), new KeyValue(vbox.opacityProperty(), 0.9) ) ); } }); //Slider being current and ability to click on slider. playa.currentTimeProperty().addListener(new ChangeListener<Duration>(){ @Override public void changed(ObservableValue<? extends Duration> observableValue, Duration duration, Duration current){ slider.setValue(current.toSeconds()); } }); slider.setOnMouseClicked(new javafx.event.EventHandler<javafx.scene.input.MouseEvent>() { @Override public void handle(javafx.scene.input.MouseEvent t) { playa.seek(Duration.seconds(slider.getValue())); } }); }
公共类播放器扩展应用程序{ 私有布尔值atEndOfMedia=false; 私有最终布尔重复=false; 私有布尔stopRequested=false; 私人期限; 自有品牌游戏时间; 私人滑杆滑杆; @凌驾 public void start(final Stage)引发异常{ stage.setTitle(“电影播放器”);//设置标题 组根=新组();//按钮等的组 最终媒体=新媒体(“file:///Users/Paul/Downloads/InBruges.mp4"); 最终MediaPlayer播放A=新MediaPlayer(媒体); MediaView=新MediaView(playa); //滑入滑出以及是什么原因造成的。 最终时间线slideIn=新时间线(); 最终时间线滑出=新时间线(); root.setonMouseCenter(新的javafx.event.EventHandler(){ @凌驾 公共无效句柄(MouseEvent t){ slideIn.play(); } }); setOnMouseExited(新的javafx.event.EventHandler(){ @凌驾 公共无效句柄(MouseEvent t){ slideOut.play(); } }); 最终VBox VBox=新的VBox(); 最终滑块=新滑块(); 最终按钮播放按钮=新按钮(“|>”); root.getChildren().add(视图); root.getChildren().add(vbox); vbox.getChildren().add(滑块); vbox.getChildren().add(播放按钮); vbox.setAlignment(位置中心); Scene-Scene=新场景(root,400400,Color.BLACK); 舞台场景; stage.show(); //播放/暂停按钮 playButton.setOnAction(新的EventHandler(){ @凌驾 公共无效句柄(ActionEvent e){ Status Status=playa.getStatus(); if(status==status.UNKNOWN | | status==status.stopped) { //在这些州什么都不要做 返回; } if(status==status.PAUSED ||status==status.READY ||状态==状态。已停止) { //如果我们坐在结尾,倒带电影 如果(atEndOfMedia){ playa.seek(playa.getStartTime()); atEndOfMedia=false; } playa.play(); }否则{ 暂停(); } } }); //听众和狗屎播放按钮 playa.setOnPlaying(新的Runnable(){ @凌驾 公开募捐{ 如果(请求停止){ 暂停(); stopRequested=false; }否则{ playButton.setText(“| |”); } } }); playa.setOnPaused(新的Runnable(){ @凌驾 公开募捐{ playButton.setText(“>”); } }); playa.play(); playa.setOnReady(新的Runnable(){ @凌驾 公开募捐{ int v=playa.getMedia().getWidth(); int h=playa.getMedia().getHeight(); 阶段设置最小宽度(v); 阶段.设定高度(h); vbox.setMinSize(v,100); vbox.setTranslateY(h-50); //滑块和图形滑入/滑出 slider.setMin(0.0); 滑块设置值(0.0); slider.setMax(playa.getTotalDuration().toSeconds()); slideOut.getKeyFrames().addAll( 新关键帧(新持续时间(0), 新键值(vbox.translateYProperty(),h-100), 新的键值(vbox.opacityProperty(),0.9) ), 新关键帧(新持续时间(300), 新的键值(vbox.translateYProperty(),h), 新的键值(vbox.opacityProperty(),0.0) ) ); slideIn.getKeyFrames().addAll( 新关键帧(新持续时间(0), 新的键值(vbox.translateYProperty(),h), 新的键值(vbox.opacityProperty(),0.0) ), 新关键帧(新持续时间(300), 新键值(vbox.translateYProperty(),h-100), 新的键值(vbox.opacityProperty(),0.9) ) ); } }); //滑块是当前的,并且能够单击滑块。 playa.currentTimeProperty().addListener(新的ChangeListener()){ @凌驾
公共无效已更改(可观察值使用
JFXPanel

 public class Test {

     private static void initAndShowGUI() {
         // This method is invoked on Swing thread
         JFrame frame = new JFrame("FX");
         final JFXPanel fxPanel = new JFXPanel();
         frame.add(fxPanel);
         frame.setVisible(true);

         Platform.runLater(new Runnable() {
             @Override
             public void run() {
                 initFX(fxPanel);
             }
         });
     }

     private static void initFX(JFXPanel fxPanel) {
         // This method is invoked on JavaFX thread
         Scene scene = createScene();
         fxPanel.setScene(scene);
     }

     public static void main(String[] args) {
         SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
                 initAndShowGUI();
             }
         });
     }
 }
其中方法
createScene()
是代码中的
start(final Stage)

只需将场景放在舞台上,您就可以将其返回。

请注意,虽然JFXPanel可以实现这一点,但性能很差,因为JFXPanel。对于简单的GUI来说,这并不重要,但对于媒体播放来说,它确实重要。目前除了使用完整的JavaFX应用程序外,没有解决方案。如果将来的JavaFX版本添加了ABL要在JavaFX窗口中嵌入Swing组件,这可能是比在Swing中嵌入JavaFX更好的技术。