2017-02-07 2 views
0

Я изучаю, как использовать JavaFx, и я пытаюсь создать медиаплеер с двумя сценами, где один воспроизводит видео, а другой играет музыку. Я сейчас работаю над видеосценой и не могу понять, почему мой код не работает.Как воспроизвести медиа в стеке в Javafx?

public class MediaApp extends Application { 

    Media video_source; 
    MediaPlayer video_mp; 
    MediaView video_mv; 

    @Override 
    public void start(Stage primaryStage) { 
     Pane root1 = new Pane(); 
     BorderPane videoPane = new BorderPane(); 
     Scene vidScene = new Scene(videoPane, 1280, 800); 
     Scene mainScene = new Scene(root1, 1280, 800); 

     MenuBar video_menuBar = new MenuBar(); 
     Menu video_menuFile = new Menu("File"); 

     MenuItem video_open = new MenuItem("Open File..."); 
     video_open.setOnAction((ActionEvent t) -> { 
      File file = new FileChooser().showOpenDialog(primaryStage); 
      if (file != null) { 
       video_source = new Media(file.toURI().toString()); 
       video_mv = new MediaView(video_mp); 
      } 
     }); 
     video_menuFile.getItems().addAll(video_open); 

     Menu video_menuEdit = new Menu("Edit"); 

     Menu video_menuView = new Menu("View"); 
     MenuItem mainPage = new MenuItem("Main Menu"); 
     mainPage.setOnAction(e -> primaryStage.setScene(mainScene)); 
     video_menuView.getItems().add(mainPage); 

     video_menuBar.getMenus().addAll(video_menuFile, video_menuEdit, video_menuView); 
     video_menuBar.prefWidthProperty().bind(videoPane.widthProperty()); 

     videoPane.setTop(video_menuBar); 
     StackPane stack = new StackPane(); 
     stack.getChildren().addAll(new Rectangle(1000, 600, Color.BLACK), video_mv); 
     videoPane.setCenter(stack); 
     video_mp.play(); 

     primaryStage.setScene(mainScene); 

     primaryStage.setTitle("Media Player"); 
     primaryStage.show(); 
    } 

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

Я также хотел бы отметить, что я хочу, чтобы черный прямоугольник присутствовал даже при отсутствии воспроизведения видео.

+0

Что означает «это не работает»? Что происходит? Отсканированный фрагмент не будет компилироваться, поэтому нет никаких шансов, чтобы кто-нибудь догадался, что может быть неправильным. –

+0

@James_D Я продолжаю получать исключение Runtime и исключение NullPointerException. Все, что мне нужно знать, - как воспроизвести видео в области, которая меньше моего экрана? – user3656280

+0

@ user3656280 Итак, вы попробовали мое предложение? – Enigo

ответ

1

В вашем коде есть несколько проблем. Короче говоря, в setOnAction вы должны создать MediaPlayer из выбранного видеофайла, а затем установить его как игрока для MediaView, а затем воспроизвести его.

Вот рабочий пример:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.media.MediaView; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.FileChooser; 
import javafx.stage.Stage; 

import java.io.File; 

public class Video extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Pane root = new Pane(); 
     BorderPane videoPane = new BorderPane(); 
     Scene mainScene = new Scene(root, 1280, 800); 

     MenuBar video_menuBar = new MenuBar(); 
     Menu video_menuFile = new Menu("File"); 

     MediaView video_mv = new MediaView(); 

     MenuItem video_open = new MenuItem("Open File..."); 
     video_open.setOnAction(t -> { 
      FileChooser chooser = new FileChooser(); 
      File file = chooser.showOpenDialog(primaryStage); 
      if (file != null) { 
       Media video_source = new Media(file.toURI().toString()); 
       MediaPlayer video_mp = new MediaPlayer(video_source); 
       video_mv.setMediaPlayer(video_mp); 
       video_mp.play(); 
      } 
     }); 
     video_menuFile.getItems().addAll(video_open); 

     Menu video_menuEdit = new Menu("Edit"); 

     Menu video_menuView = new Menu("View"); 
     MenuItem mainPage = new MenuItem("Main Menu"); 
     mainPage.setOnAction(e -> primaryStage.setScene(mainScene)); 
     video_menuView.getItems().add(mainPage); 

     video_menuBar.getMenus().addAll(video_menuFile, video_menuEdit, video_menuView); 
     video_menuBar.prefWidthProperty().bind(videoPane.widthProperty()); 

     videoPane.setTop(video_menuBar); 
     StackPane stack = new StackPane(); 
     stack.getChildren().addAll(new Rectangle(1000, 600, Color.BLACK), video_mv); 
     videoPane.setCenter(stack); 

     root.getChildren().add(videoPane); 

     primaryStage.setScene(mainScene); 

     primaryStage.setTitle("Media Player"); 
     primaryStage.show(); 
    } 

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

} 

Обратите внимание, что некоторые видео форматы are not supported.

Смежные вопросы