2012-09-23 46 views
3

我有一個用Swing編寫的應用程序,其中我想使用JavaFX的MediaPlayer播放音頻/聲音文件。在現有的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

與嵌入在Swing應用程序中的JavaFX控件進行交互時,絕對在Platform.runLater調用中執行此操作,而不是調用Swing.invokeLater調用。

您還應該確保JavaFX系統已初始化,並且(最好)應用程序使用本帖中提到的JavaFX打包工具進行了封裝:Playing audio using JavaFX MediaPlayer in a normal Java application?

雖然運行一些代碼可以創建一些JavaFX控件,而JavaFX線程可以用於大多數控件,甚至與某些控件的某些交互似乎有時可以在JavaFX線程上運行,但實際上我發現它不值得冒險並且可能會掩蓋錯誤或者您在這樣做時可能遇到的競爭條件。 JavaFX設計時考慮了用戶界面的單線程交互模型,因此最好使用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(); 

交互與束縛水飽和度NG架構,因此應被包裹在Swing.invokeLater

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

注:只有一個runLater呼叫是不夠的,還需要在MediaPlayer後從runLater體內的invokeLater了Swing的JFrame通話玩電話。

+0

根據問題中的建議檢查代碼,看看是否確定。以下可能不適用於您的案例,但您可以嘗試在NetBeans中創建JavaFX項目類型並將主類設置爲您的Swing類(它可能不是受支持的配置,但對於我今天早些時候它似乎可以正常工作)。這樣,Netbeans將使用JavaFX工具自動完成所有打包,併爲您創建一個支持JavaFX的jar,而無需您自己的構建文件和清單。 – jewelsea

+0

如果您仍然遇到問題,請創建一個簡短的可執行示例並將其發佈,環境說明和錯誤轉儲針對運行時項目創建的問題http://javafx-jira.kenai.com – jewelsea

+0

感謝所有信息寶石,現在解決了 –