我已经尝试了其他任何我在堆栈上发现的stackoverflow,我真的不明白为什么这不起作用。我不会向您展示无法正常工作的应用程序代码,因为即使使用示例项目,它也无法正常工作。那么问题来了:
当我用示例代码创建新的JavaFX应用程序时,该示例代码给出了单击后打印hello world的按钮,当我将其作为桌面应用程序运行时,以及当我构建此应用程序并在浏览器中启动时,此应用程序有效。作为桌面应用程序和浏览器应用程序
但是当我创建新的JavaFX FXML应用程序时,它几乎与上面相同,但阶段是由FXML和css定义的,而不是字节代码。
java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafxapplication3.JavaFXApplication3.start(JavaFXApplication3.java:22)
at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$46/15592694.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/19532686.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$35/9825943.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.NullPointerException: Location is required.
at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$46/15592694.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/19532686.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$35/9825943.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafxapplication3.JavaFXApplication3.start(JavaFXApplication3.java:22)
... 11 more
下面是工作应用程序的代码:
public class JavaFXApplication4 extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
,这个应用程序不能在浏览器中工作,并抛出异常:
public class JavaFXApplication3 extends Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
有人能帮帮我吗?
问题在这一行:
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
很明显,load方法实际上是带空参数调用的。这是因为getResource("/sample/sample.fxml")不能将资源归档。
资源在运行时类路径中丢失(或路径错误)。
源问题与签名有关,但我不完全理解这意味着什么。然后我搜索如何在浏览器中运行一个JavaFX应用程序与netbeans,发现这:http://docs.oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm
在netbeans 8.2的项目属性Build > Deployment
下有一个复选框:
请求无限制访问(启用签名)
有了这个,它就工作了。好运。
在某些情况下,如果您使用maven,您应该将所有的fxml文件移到资源目录中,并从那里使用一个相对地址。
如果你想在控制器类中使用stage.setScene()
函数,最好使用:
Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
如果你使用不同的包,那么从其他包中剪切该文件并粘贴到主包中。然后试着逃跑。我试过这种方法,现在效果很好。