【问题标题】:Instantiating a web view media player within a JavaFX application在 JavaFX 应用程序中实例化 Web 视图媒体播放器
【发布时间】:2016-05-18 09:56:13
【问题描述】:

我正在编写一个教育软件,并希望用户能够从我的 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);
        }
    }

}

对于解决此问题的任何帮助将不胜感激。

【问题讨论】:

    标签: java javafx media-player


    【解决方案1】:

    您不应自己调用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?

    【讨论】:

    • 嗨,詹姆斯,非常感谢您的回复,这确实有助于解决一些问题。我想使用测试方法的原因是因为我计划在我的 GUI 的一部分上有许多按钮,单击每个按钮将启动一个单独的视频。有什么办法可以做到这一点吗?所有按钮的控制器都位于同一个控制器类中。
    • 使封装 web 视图的类只是一个普通类,即不是Application 的子类。然后只需在按钮处理程序中引用它。这与我在答案中链接的问题非常相似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多