在JavaFX应用程序中实例化Web视图媒体播放器

时间:2016-02-08 16:40:50

标签: java javafx media-player

我正在编写一个教育软件,并希望用户能够从我的JavaFX GUI中的列表中选择要观看的视频。 我创建了一个mediaPlayer类,其中包含一个运行代码并正确显示视频的main方法, 但是我的下一个任务是实例化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类代码:

public class mediaPlayer extends Application {   

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

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

}

MediaPlayerTest课程:

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

}

非常感谢任何解决此问题的帮助。

1 个答案:

答案 0 :(得分: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?