MediaPlayer usando JavaFX 2.0

Neste post vou abordar o tema de JavaFX 2.0 de novo! Realmente o JavaFX é muito bom de programar, fácil e intuitivo, realmente é de se apaixonar (rs). Mas vamos ao assunto, vou mostrar aqui passo a passo de como criar esse MediaPlayer ai do lado usando o JavaFX 2.0, tive como base para realizar este trabalho a documentação da oracle, uma vez que as informações sobre a tecnologia são um pouco escassas. Bom mas vamos ao que interessa:

Bom, os primeiros passos para fazer o programa é:

  1. saber o que é o JavaFX 2.0;
  2. Instalar e configurar o JavaFX na sua máquina, no Windows siga os passos, no Mac OS basta baixar as bibliotecas e decompacta-las no local de sua escolha, a novidade fica por conta do lançamento do JavaFX 2.0 para Linux, ainda não testei ele para esta plataforma, mas acredito que seja apenas descompactar a biblioteca, igual no Mac OS;

Feito os passos descritos acima, vamos dar início ao tutorial. A primeira coisa a fazer é criar um novo Java Project: clicando com o botão direito → New → Java Project,  nomeie-o da maneira que quiser, e clique em Finish. Pronto, agora vamos adicionar o jar externo do JavaFX 2.0, cujo nome é jfxrt.jar, no Windows esse .jar geramente fica no caminho “X:Program FilesOracleJavaFX 2.0 SDKrtlibjfxrt.jar”, no Mac Os e provavémente no Linux a biblioteca se encontra no arquivo descompactado, dentro da pasta rt e por fim, dentro da pasta lib, antes de incluir a biblioteca no Java Build Path, vamos criar um folder para armazenar a biblioteca, lembrando que esse passo não é obrigatória, mas sim uma “regra de boas maneiras” entre os programadores, para criar o folder: clique no projetobotão direitoNew → Folder e nomeie de lib, agora basta copiar o arquivo jfxrt.jar dentro do folder lib, agora sim vamos inserir a biblioteca no Java Build Path, para isso faça: clique no projetobotão direitoProperties → Java Buil Path → Libraries → Add JARs… → Clique no seu projeto → lib → jfxrt.jar, pronto, basta clicar em Ok para finalizar.

Agora podemos criar a Classe que será a interface e a lógia do MediaPlayer, mas antes de criar a Classe, criem um Package para deixar tudo mais organizado, vá no seu Seu Java Project Clique com o botão direto em scr → New → Package e nomeie seguindo o exemplo:

package javafx.pedro.teste;

Podemos criar a nossa classe agora: Seu Java Project scr → Clique com o botão direto no Package New → Class,  e dê o nome que quiser, no meu caso chamei de MediaControl. Legal, agora estamos com o ambiente pronto para criar nosso projeto, de início vamos dar todos os imports necessário:


import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.util.Duration;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.media.MediaPlayer.Status;
import javafx.event.EventHandler;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;

Obs.: Caso algum import tenha dado errado, certifique se a biblioteca do JavaFX está devidamente importada no Java Build Path.

Na sua Classe, não se esqueça de dar o extends BorderPane que será o responsável de fazer os controles. Está Classe, fará a interface e a lógica do sistema: Se você quiser pode consultar uma tabela com os códigos das cores para inserir no seu MediaPlayer. Em suma essa Classe irá fazer todo o trabalho, a nossa próxima Classe será basicamente o Main() da nossa aplicação, bom copie o código abaixo e cole na sua Classe.

public class MediaControl extends BorderPane {

      private MediaPlayer mediaPlayer;
      private MediaView mediaView;
      private final boolean repeat = false;
      private boolean stopRequested = false;
      private boolean atEndOfMedia = false;
      private Duration duration;
      private Slider timeSlider;
      private Label playTime;
      private Slider volumeSlider;
      private HBox mediaBar;

      public MediaControl(final MediaPlayer mediaPlayer) {

          this.mediaPlayer = mediaPlayer;
          setStyle("-fx-background-color: #87CEFF;");
          mediaView = new MediaView(mediaPlayer);
          Pane mediaViewPane = new Pane();
          mediaViewPane.getChildren().add(mediaView);
          mediaViewPane.setStyle("-fx-background-color: black;");
          setCenter(mediaViewPane);
          mediaBar = new HBox();
          mediaBar.setAlignment(Pos.CENTER);
          mediaBar.setPadding(new Insets(5, 10, 5, 10));
          BorderPane.setAlignment(mediaBar, Pos.CENTER);

         final Button playButton  = new Button(">");

     playButton.setOnAction(new EventHandler<ActionEvent>() {
          public void handle(ActionEvent e) {
          Status status = mediaPlayer.getStatus();
          if (status == Status.UNKNOWN  || status == Status.HALTED){
               return;
          }
          if ( status == Status.PAUSED || status == Status.READY || status == Status.STOPPED){
               if (atEndOfMedia) {
                    mediaPlayer.seek(mediaPlayer.getStartTime());
                    atEndOfMedia = false;
               }
               mediaPlayer.play();
           }
           else {
                 mediaPlayer.pause();
                 }
          }
        });

     mediaPlayer.currentTimeProperty().addListener(new InvalidationListener(){
          public void invalidated(Observable ov) {
               updateValues();
          }
      });

     mediaPlayer.setOnPlaying(new Runnable() {
          public void run() {
               if (stopRequested) {
                    mediaPlayer.pause();
                    stopRequested = false;
                } else {
                    playButton.setText("||");
               }
             }
           });

     mediaPlayer.setOnPaused(new Runnable() {
          public void run() {
               System.out.println("onPaused");
               playButton.setText(">");
          }
          });

     mediaPlayer.setOnReady(new Runnable() {
          public void run() {
               duration = mediaPlayer.getMedia().getDuration();
               updateValues();
           }
          });

     mediaPlayer.setCycleCount(repeat ? MediaPlayer.INDEFINITE : 1);
     mediaPlayer.setOnEndOfMedia(new Runnable() {
          public void run() {
               if (!repeat) {
                    playButton.setText(">");
                    stopRequested = true;
                    atEndOfMedia = true;
              }
            }
         });

     mediaBar.getChildren().add(playButton);
     Label spacer = new Label("   ");
     mediaBar.getChildren().add(spacer);
     Label timeLabel = new Label("Time: ");
     mediaBar.getChildren().add(timeLabel);
     timeSlider = new Slider();
     HBox.setHgrow(timeSlider,Priority.ALWAYS);
     timeSlider.setMinWidth(50);
     timeSlider.setMaxWidth(Double.MAX_VALUE);

     timeSlider.valueProperty().addListener(new InvalidationListener() {
          public void invalidated(Observable ov) {
               if (timeSlider.isValueChanging()) {
                    mediaPlayer.seek(duration.multiply(timeSlider.getValue() / 100.0));
                }
           }
      });

     mediaBar.getChildren().add(timeSlider);
     playTime = new Label();
     playTime.setPrefWidth(130);
     playTime.setMinWidth(50);
     mediaBar.getChildren().add(playTime);
     Label volumeLabel = new Label("Vol: ");
     mediaBar.getChildren().add(volumeLabel);
     volumeSlider = new Slider();
     volumeSlider.setPrefWidth(70);
     volumeSlider.setMaxWidth(Region.USE_PREF_SIZE);
     volumeSlider.setMinWidth(30);

     volumeSlider.valueProperty().addListener(new InvalidationListener() {
          public void invalidated(Observable ov) {
               if (volumeSlider.isValueChanging()) {
                    mediaPlayer.setVolume(volumeSlider.getValue() / 100.0);
                }
            }
       });

     mediaBar.getChildren().add(volumeSlider);
     setBottom(mediaBar);
     }

     protected void updateValues() {
          if (playTime != null && timeSlider != null && volumeSlider != null) {
               Platform.runLater(new Runnable() {
               @SuppressWarnings("deprecation")
               public void run() {
                    Duration currentTime = mediaPlayer.getCurrentTime();
                    playTime.setText(formatTime(currentTime, duration));
                    timeSlider.setDisable(duration.isUnknown());

                    if (!timeSlider.isDisabled() && duration.greaterThan(Duration.ZERO)
                    && !timeSlider.isValueChanging()) {
                         timeSlider.setValue(currentTime.divide(duration).toMillis()* 100.0);
                     }
                     if (!volumeSlider.isValueChanging()) {
                          volumeSlider.setValue((int)Math.round(mediaPlayer.getVolume()* 100));
                     }
                   }
                 });
                }
               }

     private static String formatTime(Duration elapsed, Duration duration) {
          int intElapsed = (int)Math.floor(elapsed.toSeconds());
          int elapsedHours = intElapsed / (60 * 60);
          if (elapsedHours > 0) {
               intElapsed -= elapsedHours * 60 * 60;
          }
          int elapsedMinutes = intElapsed / 60;
          int elapsedSeconds = intElapsed - elapsedHours * 60 * 60 - elapsedMinutes * 60;

          if (duration.greaterThan(Duration.ZERO)) {
              int intDuration = (int)Math.floor(duration.toSeconds());
              int durationHours = intDuration / (60 * 60);
                   if (durationHours > 0) {
                        intDuration -= durationHours * 60 * 60;
                    }
              int durationMinutes = intDuration / 60;
              int durationSeconds = intDuration - durationHours * 60 * 60 - durationMinutes * 60;
              if (durationHours > 0) {
                   return String.format("%d:%02d:%02d/%d:%02d:%02d",
                   elapsedHours, elapsedMinutes, elapsedSeconds,
                   durationHours, durationMinutes, durationSeconds);
               } else {
                    return String.format("%02d:%02d/%02d:%02d",
                    elapsedMinutes, elapsedSeconds,durationMinutes,
                    durationSeconds);
                }
        } else {
             if (elapsedHours > 0) {
                  return String.format("%d:%02d:%02d", elapsedHours, elapsedMinutes, elapsedSeconds);
             } else {
                   return String.format("%02d:%02d",elapsedMinutes, elapsedSeconds);
                }
               }
             }
           }

Agora vamos criar nossa main, para isso crie uma nova Classe como mostrado anteriormente, nela passamos o caminho dos arquivos que queremos executar, esse aplicativo aceita apenas os formatos mp3 para música e flv para vídeo, você pode fazer o Download de vídeos .flv nestes 3 links: Link 1, Link 2 e link 3, ou pode passar como parametro a URL dos próprios links, para isso modifique a linha a seguir que usa o caminho das mídias:

private static final String MEDIA = "file:/Users/pedrosjc/Documents/workspace/TesteFX/Musica/oow2010-2.flv";

para:

private static final String MEDIA = "http://sun.edgeboss.net/download/sun/media/1460825906/1460825906_2956241001_big-buck-bunny-640x360.flv";

Feito a escolha entre a URL ou o caminho do arquivo em seu PC copie e cole em sua Classe o trecho de código a seguir:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;

import javafx.pedro.teste.MediaControl;

     public class TocadorJavaFx extends Application {

          private static final String MEDIA = "file:/Users/pedrosjc/Documents/workspace/
          TesteFX/Musica/oow2010-2.flv";
          private static String arg1;

     public void start(Stage primaryStage) {
          primaryStage.setTitle("JavaLees MediaPlayer - JavaFX 2.0");
          Group root = new Group();
          Scene scene = new Scene(root, 540, 241);

          Media media = new Media((arg1 != null) ? arg1 : MEDIA);
          MediaPlayer mediaPlayer = new MediaPlayer(media);
          mediaPlayer.setAutoPlay(true);

          MediaControl mediaControl = new MediaControl(mediaPlayer);
          scene.setRoot(mediaControl);

          primaryStage.setScene(scene);
          primaryStage.show();
      }

     public static void main ( String [] args){
          launch(args);
      }
  }

Legal, nossa aplicação já está pronta, agora basta executar o código e curtir seu novo Player feito em JavaFX 2.0, com o tempo vou adicionar melhorias a este código e postarei aqui no JavaLees, então fiquem ligados no blog!

Leitor, Espero que tenham gostado do post, teremos novidades aqui no JavaLees em breve, fiquem ligados. Para os próximos posts vamos fazer algumas coisas mais básica em JavaFX 2.0 e também falar mais sobre o nosso velho Java!

Sigam-me os Bons:

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s