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

在现有Swing项目中使用JavaFX的MediaPlayer

皮煜
2023-03-14

我有一个用Swing编写的应用程序,我想在其中使用JavaFX的MediaPlayer播放音频/声音文件。

这是主文件的压缩版本:

class MyApp
{
   private MyApp myApp;
   private JFrame myFrame;
   private Media media;
   private MediaPlayer mediaPlayer;
   public static void main(String[] args)
   {
      Runnable thread = new Runnable()
      {
         public void run()
         {
             myApp = new MyApp();
         }          
      };
      SwingUtilities.invokeLater(thread);
  }
  public void MyApp()
  {
    //this is called by SwingUtilities.invokeLater();

    URL url = //getting URL to a sound file stored locally//;
    media = new Media(url.toString() );
    mediaPlayer = new MediaPlayer( media );                        
    mediaPlayer.play();

    myFrame = new JFrame(); //building swing UI here
  }

这在Netbeans中似乎行得通。然而,当Netbeans构建一个. jar,并且我试图运行。jar中,我得到了一个错误日志文件。jar目录包含一些内存/线程错误。

我是否需要使用Platform.runLater()方法来实现此功能?或者我还有什么地方做错了?

共有1个答案

商迪
2023-03-14

与嵌入在 Swing 应用程序中的 JavaFX 控件交互时,一定要在 Platform.runLater 调用中执行此操作,而不是在 Swing.invokeLater 调用中执行此操作。

您还应该确保JavaFX系统已初始化,并且(最好)使用本帖中提到的JavaFX打包工具对应用程序进行打包:在普通Java应用程序中使用JavaFX MediaPlayer播放音频?。

虽然在JavaFX线程上运行一些创建一些JavaFX控件的代码对大多数控件都有效,甚至与某些控件的某些交互有时似乎也会在JavaFX的线程上运行,但实际上我发现这样做不值得冒风险,而且可能会隐藏错误或竞争条件。JavaFX的设计带有单线程交互模型,并考虑到了UI,因此最好使用Platform.runLater等工具保持这种模式。Swing的事件调度线程也是如此。您需要将这两个框架之间的线程交互保持分开。

查看您在问题中的MyApp代码中的5行,我有以下建议。

这与在哪个线程上执行无关,因为它不与任何框架交互:

URL url = //getting URL to a sound file stored locally//;

利用JavaFX控件做应包装在Platform.runLater中:

media = new Media(url.toString() );
mediaPlayer = new MediaPlayer( media );                        
mediaPlayer.play();

与 Swing 框架交互,因此应包装在 Swing.invokeLater

myFrame = new JFrame(); //building swing UI here

注意:只有一个run的调用是不够的,你还需要在MediaPlayer播放调用之后从run的主体内部调用Swing jfra调用。

 类似资料:
  • 我想在一个Swing应用程序中使用一些JavaFX组件(特别是JFXPanel的HTML5呈现支持)。我的应用程序目前是在Eclipse4.3(Kepler)中设置的,我的机器上安装了最新的Java7 JDK。 这篇来自Oracle的教程建议您只需引用一个JavaFX类,它就可以在Swing应用程序中工作。所以我输入,但是Eclipse不能将其识别为有效的Java类。它确实可以识别其他Java7类

  • 在Netbeans 8.0中,我使用Maven开发JavaFX项目。我的java版本是1.7,升级到Java8有问题。我尝试将POM文件中的和更改为1.8 当我尝试创建新的JavaFX项目(如文件-new project-maven category-JavaFX Application)时,我仍然得到了使用JDK1.7的项目。如何强制使用JDK1.8?

  • 我有一个现有的Android项目,结构如下: 谢谢!

  • 问题内容: 自从Go 1.5发布以来,我开始着眼于如何将其集成到我现有的项目中。 该项目的代码库完全用C编写,可以低级访问硬件和其他有趣的东西。但是,某些较高层次的东西很繁琐,我想开始用较高层次的语言(Go)编写它们 我可以通过C程序调用Go代码吗?我安装了Go 1.5,它添加了(https://golang.org/s/execmodes),我正试图开始工作。 但是,我似乎无法让Go生成适当的头

  • 我开始着手一个JavaFX项目,在这个项目中,我想添加一个复制的文本,而不必更改驱动程序中的格式和图像(它应该像open office一样工作)。图像应该能够放置在文本中不同的位置。因此,我需要一个可以处理rtf格式的控制字段。 为此,我找到了RichTextFX。文档中解释了如何使用Maven或Grandle运行RichTextFX。我不使用Maven或Grandle,因此我想知道是否有可能在不

  • 我将AWS amplify与auth、dynamodb和GraphQLAPI一起用于react本机应用程序。现在我需要将现有的后端添加到web应用程序。我运行下面的命令,获得带有API、auth和函数的amplify后端文件夹。缺少用于查询和转换的graphql文件夹(graphql客户端)。如何获取GraphQL客户端文件夹以从数据库中获取数据?

  • 问题内容: 我有一个完全用C编写的程序,其中使用了多个目标文件。这些文件都打包在一个存档文件中,而该存档文件又在程序主文件的编译时使用。 我想在Go中为此项目编写一个新文件。我的想法是编写此文件,然后从中创建一个目标文件。之后,我想将此对象文件放入已经提到的存档文件中。 这基本上意味着 我想从C程序调用Go函数。我已经阅读了这个问题,虽然它告诉我可以通过GCCGO实现我想要的东西,但是如何做到这一

  • 我使用Swing和JavaFX将图像呈现到屏幕上,但得到了意想不到的时间:目标只是在组件上的随机位置呈现1,000,000个图像。为什么JavaFX花了这么长时间? 结果:摆动2.5秒。JavaFX 8.5秒。下面的代码。 在JavaFX中。 用了8.230974466秒 JAVAFX花费了0.02173174秒@10,000个映像,第二次运行花费了0.018200605秒 SWING用了0.13