3

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()これを機能させるには、このメソッドを使用する必要がありますか?それとも私が間違っていることは他にありますか?

4

1 に答える 1

4

Swingアプリに埋め込まれているJavaFXコントロールを操作するときは、Platform.runLater呼び出しではなく、Swing.invokeLater呼び出し内でこれを実行してください。

また、JavaFXシステムが初期化されていること、および(できれば)この投稿で説明されているように、JavaFXパッケージツールを使用してアプリケーションが攻撃されていることを確認する必要があります。通常のJavaアプリケーションでJavaFX MediaPlayerを使用してオーディオを再生しますか?

JavaFXスレッドからJavaFXコントロールを作成するコードを実行すると、ほとんどのコントロールで機能し、一部のコントロールとの相互作用でさえJavaFXスレッドで機能する場合がありますが、実際には、リスクに見合う価値がなく、エラーや競合状態がわかりにくくなる可能性があります。そうしている間に遭遇するかもしれません。JavaFXは、UIを念頭に置いたシングルスレッドインタラクションモデルを使用して設計されているため、などのツールを使用してそのように維持するのが最善Platform.runLaterです。イベントディスパッチスレッドを使用するSwingについても同じことが言えます。これら2つのフレームワーク間のスレッド化された相互作用を分離しておく必要があります。

質問の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

注:呼び出しに1つのrunLaterだけでは不十分です。また、MediaPlayerの再生呼び出しの後にrunLater本体の内側からSwingjframe呼び出しを呼び出す必要があります。

于 2012-09-23T04:54:46.107 に答える