2012-07-19 46 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)。 而不是把場景放到舞臺上,然後返回它。