2012-07-19 1 views
2

J'ai fait un simple Media Player pour une application sur laquelle je travaille, le problème est que je pensais que vous pouviez simplement intégrer JavaFX dans Swing. Ce qui n'est pas le cas. J'ai cherché une solution à ce problème et essayé d'utiliser ce site: http://docs.oracle.com/javafx/2/swing/jfxpub-swing.htm Le problème est que même si j'ai le site Web qui explique comment mettre le code ensemble, je ne comprends toujours pas comment. Voici le mediaplayer et je prévois de l'intégrer dans mon code Swing, afin que je puisse appeler le lecteur multimédia quand un bouton est cliqué. Voici tout mon code pour le lecteur multimédia et si quelqu'un peut partager la lumière sur la façon de l'intégrer dans mon code Swing, c'est-à-dire mon interface graphique, je devrais probablement vous embrasser à travers l'ordinateur.Comment lancer un javaFX MediaPlayer en mode swing?

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

Notez que bien que cela soit possible avec JFXPanel, les performances sont mauvaises car JFXPanel [utilise uniquement un chemin de rendu logiciel] (http://www.mail-archive.com/[email protected]/msg03320 .html). Pour les GUI simples, cela n'a pas d'importance, mais pour la lecture multimédia, c'est le cas. Il n'y a actuellement aucune solution pour cela, sauf pour utiliser une application JavaFX complète. Si et quand une future version de JavaFX ajoutera la possibilité d'incorporer des composants Swing dans une fenêtre JavaFX, ce sera probablement la meilleure technique que l'intégration de JavaFX dans Swing. – Boann

Répondre

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

où la méthode createScene() est start(final Stage stage) à partir de votre code. Juste au lieu de mettre scène à scène, vous le retournez.

Questions connexes