2016-02-08 4 views
0

Я пишу часть образовательного программного обеспечения и хочу, чтобы пользователь мог выбрать видео для просмотра из списка, который находится в моем графическом интерфейсе JavaFX.Создание медиафайла в приложении JavaFX

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

Я попытался закодировать mediaPlayerTest, в результате чего я создания экземпляра MediaPlayer, передать его URL-адрес в качестве параметра, а затем вызвать метод Start(), однако я получаю следующие ошибки при запуске моего класса тестера:

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at javafx.scene.web.WebView.<init>(WebView.java:271) 
    at Media.mediaPlayer.start(mediaPlayer.java:34) 
    at Media.MediaPlayerTest.main(MediaPlayerTest.java:23) 
Caused by: java.lang.RuntimeException: Internal graphics not initialized yet 
    at com.sun.glass.ui.Screen.getScreens(Screen.java:70) 
    at com.sun.javafx.webkit.prism.PrismGraphicsManager.<init>(PrismGraphicsManager.java:43) 
    at javafx.scene.web.WebEngine.<clinit>(WebEngine.java:290) 
    ... 3 more 

Любая помощь для решения этой проблемы была бы оценена, вы можете найти класс тестера и медиаплеера код класса ниже:

MediaPlayer

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

public class mediaPlayer extends Application { 



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


    // The url of the video to be played 
    String url = "https://www.youtube.com/embed/CySfQY_lgr4"; 

    public mediaPlayer(String url) { 

     this.url = url; 

    } 

    @Override public void start(Stage stage) throws Exception { 
    WebView webview = new WebView(); 
    webview.getEngine().load(url); 
    webview.setPrefSize(640, 390); 

    stage.setScene(new Scene(webview)); 
    stage.show(); 
    }  
} 

MediaPlayerTest

package Media; 

import java.util.logging.Level; 
import java.util.logging.Logger; 


/** 
* 
* @author Joe 
*/ 
public class MediaPlayerTest { 

    public static void main (String[] args) { 

     try { 
      mediaPlayer mp = new mediaPlayer("https://www.youtube.com/embed/CySfQY_lgr4"); 
      mp.start(null); 
     } catch (Exception ex) { 
      Logger.getLogger(MediaPlayerTest.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 

ответ

0

Вы не должны вызывать start() себя: он вызывается как часть сложного процесса при вызове launch().

Так что вы можете сделать:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

import java.util.List ; 

public class MediaPlayer extends Application { 



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


    // The url of the video to be played 
    private String url = "https://www.youtube.com/embed/CySfQY_lgr4"; 


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

    List<String> params = getParameters.getRaw(); 
    if (params.size() > 0) { 
     url = params.get(0); 
    } 

    WebView webview = new WebView(); 
    webview.getEngine().load(url); 
    webview.setPrefSize(640, 390); 

    stage.setScene(new Scene(webview)); 
    stage.show(); 
    }  
} 

, а затем (если вы хотите, но, как правило, это не очень хороший подход):

import java.util.logging.Level; 
import java.util.logging.Logger; 


/** 
* 
* @author Joe 
*/ 
public class MediaPlayerTest { 

    public static void main (String[] args) { 

     try { 
      Application.launch(MediaPlayer.class, "https://www.youtube.com/embed/CySfQY_lgr4"); 
     } catch (Exception ex) { 
      Logger.getLogger(MediaPlayerTest.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

} 

Очевидно здесь MediaPlayerTest класс несколько лишними в любом случае: вы можете просто запустить класс MediaPlayer.

Суть в том, что подклассы Application представляют собой точку входа приложения, и поэтому они не предназначены для многоразового использования. Если вы хотите повторно использовать свой класс MediaPlayer в другом месте, то реорганизовать его, чтобы он не был подклассом Application. См. Java: How do I start a standalone application from the current one when both are in the same package?

+0

Привет, Джеймс, большое спасибо за ваш ответ, это, безусловно, помогло разобраться в нескольких вещах. Причина, по которой я хотел использовать метод тестера, заключалась в том, что я планировал иметь несколько кнопок в разделе моего графического интерфейса, каждый щелчок запускал отдельное видео. Есть ли способ сделать это? Контроллеры для всех кнопок находятся в одном классе контроллера. – freshwaterjoe

+0

Сделайте класс, инкапсулирующий веб-представление, только обычным классом, I.e. Не является подклассом 'Application'. Затем просто укажите его в обработчиках кнопок. Это очень похоже на вопрос, который я задал в ответ. –

Смежные вопросы