Как закрыть видео после остановки в приложении JavaFX? - PullRequest
0 голосов
/ 11 января 2019

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

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

Как закрыть видео или удалить его после финиша?

Как разместить видео в основной класс?

Основной класс

публичный класс Main extends Application {

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



 @Override
 public void start(Stage primaryStage) throws Exception {

 try {

  FXMLLoader loader = new 
  FXMLLoader(getClass().getResource("resources/fxml/card.fxml"));
  Parent root = loader.load();

  Scene scene = new Scene(root, 1600, 600);
  primaryStage.setScene(scene);
   scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
  primaryStage.initStyle(StageStyle.UNDECORATED);
  primaryStage.setMaximized(true);
  primaryStage.setResizable(true);

  primaryStage.getIcons().add(new Image("src/card/resources/logo-icon.png"));
  primaryStage.show();

  //adding resize and drag primary stage
  ResizeHelper.addResizeListener(primaryStage);


  //assign ALT+ENTER to maximize window
  final KeyCombination kb = new KeyCodeCombination(KeyCode.ENTER, 
  KeyCombination.CONTROL_DOWN);
  scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() 
  {
      @Override
      public void handle(KeyEvent event) {
      if (kb.match(event)) {
        primaryStage.setMaximized(!primaryStage.isMaximized());
        primaryStage.setResizable(true);
        Controller cont = Context.getInstance().getController();
        if (!primaryStage.isMaximized()) {
          cont.getBtnFont().setPrefWidth(20);
          cont.getBtnPalette().setPrefWidth(20);
          cont.getBtnQuestCards().setPrefWidth(20);
          cont.getBtnNonQuestCards().setPrefWidth(20);
          cont.getRandomCard().setTopAnchor(cont.getRandomCard(), 80.0);
          cont.getRandomCard().setBottomAnchor(cont.getRandomCard(), 70.0);
          cont.getRandomCard().setLeftAnchor(cont.getRandomCard(), 300.0);
          cont.getRandomCard().setRightAnchor(cont.getRandomCard(), 200.0);

          cont.getRandomCardBack().setTopAnchor(cont.getRandomCardBack(), 80.0);
          cont.getRandomCardBack().setBottomAnchor(cont.getRandomCardBack(), 70.0);
          cont.getRandomCardBack().setLeftAnchor(cont.getRandomCardBack(), 300.0);
          cont.getRandomCardBack().setRightAnchor(cont.getRandomCardBack(), 200.0);

          cont.getRectRandom().setWidth(1060);
          cont.getRectRandom().setHeight(410);

          cont.getRectRandomBack().setWidth(1060);
          cont.getRectRandomBack().setHeight(410);

          cont.getRandomCard().setPrefWidth(800);
          cont.getRandomCard().setPrefHeight(200);

          cont.getRandomCardBack().setPrefWidth(800);
          cont.getRandomCardBack().setPrefHeight(200);


        } else if (primaryStage.isMaximized()){
          cont.getBtnFont().setPrefWidth(50);
          cont.getBtnPalette().setPrefWidth(50);
          cont.getBtnQuestCards().setPrefWidth(50);
          cont.getBtnNonQuestCards().setPrefWidth(50);
          cont.getRandomCard().setTopAnchor(cont.getRandomCard(), 150.0);
          cont.getRandomCard().setBottomAnchor(cont.getRandomCard(), 130.0);
          cont.getRandomCard().setLeftAnchor(cont.getRandomCard(), 450.0);
          cont.getRandomCard().setRightAnchor(cont.getRandomCard(), 270.0);

          cont.getRandomCardBack().setTopAnchor(cont.getRandomCardBack(), 150.0);
          cont.getRandomCardBack().setBottomAnchor(cont.getRandomCardBack(), 130.0);
          cont.getRandomCardBack().setLeftAnchor(cont.getRandomCardBack(), 450.0);
          cont.getRandomCardBack().setRightAnchor(cont.getRandomCardBack(), 270.0);

          cont.getRectRandom().setWidth(1160);
          cont.getRectRandom().setHeight(760);

          cont.getRectRandomBack().setWidth(1160);
          cont.getRectRandomBack().setHeight(760);

          cont.getRandomCard().setPrefWidth(800);
          cont.getRandomCard().setPrefHeight(400);

          cont.getRandomCardBack().setPrefWidth(800);
          cont.getRandomCardBack().setPrefHeight(400);

        }
      }
      }
    });



    } catch (Exception e) {
    e.printStackTrace();
   }
 }
}

Класс контроллера:

@FXML
public void initialize(URL location, ResourceBundle resources) {

String path = new File("src/card/resources/intro.mp4").getAbsolutePath();
me = new Media(new File(path).toURI().toString());
mp = new MediaPlayer(me);
media.setMediaPlayer(mp);
mp.setAutoPlay(true);
media.setSmooth(true);
}

Ответы [ 2 ]

0 голосов
/ 18 января 2019

РЕШЕНИЕ НАЙДЕНО!

Я сделал анимацию до непрозрачности MediaView:

@FXML  public void initialize(URL location, ResourceBundle resources) {

mp = new MediaPlayer(new Media(this.getClass().getResource(MEDIA_URL).toExternalForm()));
    media.setMediaPlayer(mp);
    media.setSmooth(true);
    mp.setAutoPlay(true);

    Timeline tm = new Timeline(new KeyFrame(Duration.millis(3000), new KeyValue(media.opacityProperty(),  0.0)));
    tm.setDelay(Duration.millis(5500));
    tm.play();
}
0 голосов
/ 13 января 2019

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

Класс JavaFX MediaPlayer предоставляет метод statusProperty(), который возвращает объект типа ReadOnlyObjectProperty<MediaPlayer.Status>.

Класс ReadOnlyObjectProperty<T> реализует интерфейс ObservableValue<T>, который обеспечивает метод addListener(ChangeListener<? super T>).

Интерфейс ChangeListener<T> является «функциональным интерфейсом», который требует реализации для метода void changed(ObservableValue<T> observable, T oldValue, T newValue).

Итак, собрав его вместе, вы сможете создать слушателя, который будет реагировать на изменение статуса вашего MediaPlayer:

private void addStatusListener(MediaPlayer mp) {
    ReadOnlyObjectProperty<MediaPlayer.Status> statusProperty = mp.
            statusProperty();
    statusProperty.addListener((v, o, n) -> playerStatusChanged(v, o, n));
}

private void playerStatusChanged(
        ObservableValue<? extends MediaPlayer.Status> observable,
        MediaPlayer.Status oldValue, MediaPlayer.Status newValue) {
    if (oldValue == MediaPlayer.Status.PLAYING &&
            newValue == MediaPlayer.Status.STOPPED) {
        // TODO: CALL METHOD TO REACT TO VIDEO BEING STOPPED.
    }
}
...