当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX应用程序中停止后关闭视频?

微生青青
2023-03-14

我正在用场景构建器创建一个JavaFX应用程序。我在开头加了一段视频。所以我想播放视频之前,我的应用程序启动在全屏模式。问题是当它停止时,我只看到黑色尖叫,什么也没发生,我想这是因为视频是全屏的,它没有自动关闭。

我也有一个bug,在视频开始之前,我的主窗口的一些闪烁。我想这是因为视频放在控制器中,在我的应用程序启动后开始。

公共类主扩展应用程序{

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

共有1个答案

陆敏学
2023-03-14

我不确定你看到的眨眼,但当视频停止时应该很容易做出反应。

JavaFXMediaPlayer类提供了一个方法StatusProperty(),它返回一个类型为ReadOnlyObjectProperty 的对象。

ReadOnlyObjectProperty 实现接口ObservableValue ,该接口提供方法AddListener(ChangeListener )

因此,将其组合在一起,您应该能够创建一个侦听器,该侦听器将对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.
    }
}
 类似资料:
  • 我试图重新创建Connect四,我成功了。但我想通过频繁地切换颜色,给玩家一个获胜的四张光盘在哪里的指示。我对线程和编程中的时间概念是新的。 我也成功地给了用户这个指示,但是在关闭应用程序之后,控制台仍然会给出输出,也是在使用SetonCloserEquest时。 代码如下:

  • 问题内容: 当我使用WebEngine创建播放YouTube视频的新舞台时,关闭它之后-Youtube继续在backgroung上播放。如果我使用“ Platform.exit”-它会关闭我的所有JavaFX App,但我只想关闭为YouTube创建的阶段。 这是我针对YouTube播放器的课程: 在“主舞台”中单击按钮后,我的YouTube播放器舞台正在创建: 问题答案: 您无法处置WebEng

  • 我有一个简单的控制台应用程序,有时需要执行图形操作,对于那些我使用JavaFx框架(有一些功能,我需要像css样式的文本)我只是生成一些形状和文本到一个隐藏的场景,然后保存在文件中仅此而已, 我知道要使用JavaFx,我必须将图形操作传递给JavaFx线程,但是当一切都完成后,我必须关闭应用程序(几个小时后),这个JavaFx线程仍然保持打开...我真的不想强行退出System.exit(),因为

  • 问题内容: 在Swing中,您可以简单地用于在关闭窗口时关闭整个应用程序。 但是,在JavaFX中找不到等效项。我有多个打开的窗口,如果一个窗口关闭,我想关闭整个应用程序。用JavaFX做到这一点的方法是什么? 编辑: 我了解可以覆盖以在窗口关闭时执行一些操作。问题是应该执行什么操作才能终止整个应用程序? 类中定义的方法不执行任何操作。 问题答案: 当最后一个关闭时,应用程序自动停止。目前,您的类

  • 代码非常简单,我搜索了一下,发现我只会用到 这似乎不起作用,我也尝试过使用平台参数,比如 下面是您可以运行的测试应用程序: 锁定得可拥有同步器:-无 更新:我正在Linux Fedora 16 64bit上使用最新的Oracle JDK 7u17 64bit。

  • 我有问题关闭我的javaFX应用程序,当我点击关闭按钮从我的阶段,我的应用程序消失,但如果我寻找它在我的任务管理器我的应用程序仍然没有关闭。我尝试使用下面的代码强制关闭主线程和所有子线程,但是问题仍然存在。