我正在编写一个教育软件,并希望用户能够从我的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);
}
}
}
非常感谢任何解决此问题的帮助。
答案 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?