2012-07-19 182 views
2

我为我正在处理的应用程序制作了一个简单的媒体播放器,问题是我认为您可以简单地将JavaFX集成到Swing中。事实并非如此。我一直在寻找这个问题的解决方案,并试图使用这个网站:http://docs.oracle.com/javafx/2/swing/jfxpub-swing.htm 问题是,即使我有网站,解释如何把代码放在一起,我仍然不明白如何。这里是mediaplayer,我打算将它集成到我的Swing代码中,以便在单击按钮时调用媒体播放器。这里是我用于媒体播放器的所有代码,如果任何人都可以分享一些关于如何将它集成到我的Swing代码(即我的GUI)中,我可能不得不通过计算机亲吻你。如何在swing中运行javaFX MediaPlayer?

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())); 
     } 
}); 
} 
+0

请注意,尽管JFXPanel可以实现这一点,但性能并不理想,因为JFXPanel [只使用软件渲染路径](http://www.mail-archive.com/[email protected]/msg03320的.html)。对于简单的图形用户界面来说,它并不重要,但对于媒体播放而言它并不重要目前没有解决方案,除了使用完整的JavaFX应用程序。如果未来版本的JavaFX增加了将Swing组件嵌入到JavaFX窗口中的能力,那么这可能会比在Java中嵌入JavaFX更好。 – Boann 2013-12-07 19:18:53

回答

2

Use 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 stage)。 而不是把场景放到舞台上,然后返回它。