我想为我的JavaFX应用程序设置一个控制器,它自动将FXML文件“view.FXML”加载到成员“父根”中,并接受构造函数参数(在本例中为“字符串消息”)。
我让它工作得很好,但后来我试图使用Spring实例化一个DemoController实例,我收到了一个“NullPointerException:Root不能为null”。这让我很恼火,因为使用Spring的bean实例化似乎工作得很好,但它没有正确地加载FXML。我唯一的猜测是目录结构可能被搞乱了,但我无法修复它,我将非常乐意提供任何帮助:)
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
DemoController myController = (DemoController) context.getBean("myController");
primaryStage.setScene(new Scene(myController.getRoot()));
primaryStage.setTitle("Game of Life");
primaryStage.show();
((ClassPathXmlApplicationContext) context).close();
}
}
import java.io.IOException;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
public abstract class FXMLController implements Initializable {
protected Parent root;
protected String fxmlFilePath;
public void afterPropertiesSet() throws Exception {
loadFXML();
}
protected final void loadFXML() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource(fxmlFilePath));
loader.setController(this);
this.root = loader.load();
}
public Parent getRoot() {
return root;
}
public void setFxmlFilePath(String fxmlFilePath) {
this.fxmlFilePath = fxmlFilePath;
}
}
demoController.java
import java.net.URL;
import java.util.ResourceBundle;
public class DemoController extends FXMLController {
public DemoController(String message) {
System.out.println(message);
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
System.out.println("initializing");
}
}
beans.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id = "myController" class = "DemoController">
<constructor-arg value = "message"/>
<property name = "fxmlFilePath" value = "/view.fxml"/>
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns:fx="http://javafx.com/fxml/1">
<!-- TODO Add Nodes -->
</AnchorPane>
message
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Root cannot be null
at javafx.scene.Scene.<init>(Scene.java:336)
at javafx.scene.Scene.<init>(Scene.java:194)
at Main.start(Main.java:21)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
... 1 more
Exception running application Main
您没有实现InitializingBean
,因此永远不会调用AfterPropertiesSet
。实现这个接口应该可以解决这个问题:
public abstract class FXMLController implements Initializable, InitializingBean {
...
@Override
public void afterPropertiesSet() throws Exception {
loadFXML();
}
...
}
问题内容: 我想在我的应用程序中加载一个fxml文件。我使用下一个代码: 使用一些fxml,一切正常,与其他人我得到此异常: 我不明白为什么会收到这个例外。 谢谢。 编辑: 添加包括示例: 我的父母fxml 我的包含文件: 问题答案: 这是解决方案。 为加载程序添加以下行: 非常糟糕的错误。
我有下面的FXML,它是我在另一个场景中按下按钮时加载的 代码是: 如果我这样做,一切都显示得很好。但我想在这个场景中添加一个带有动态消息的标签,并且仍然保留fxml中的所有内容。如果我这样做,其中消息是字符串 在< code>setScene之前,它将添加我的标签,但不添加来自fxml的元素。 有什么建议吗?谢谢
问题内容: 我有2个fxml文件: 布局(标题,菜单栏和内容) Anchorpane(应该放在另一个fxml文件的内容中) 我想知道如何从“主”场景将第二个文件加载到内容空间内。在javaFX中工作是一件好事,还是加载一个新场景更好? 我正在尝试做这样的事情,但是不起作用: 谢谢您的帮助。 问题答案: 为什么您的代码不起作用 加载程序会创建一个新的AnchorPane,但是您绝不会将新窗格添加到场
null 我正试着做这样的事情,但它不起作用: 谢谢你的帮助。
我正在尝试创建javafx applet,使用IntelliJ idea。构建之后,我得到了三个文件:.jar、.jnlp和.html。如果我启动jar所有工作都很好,但是如果我尝试使用jnlp或html运行app,它会抛出异常: 为什么会这样?Jar正好包含所需的位于指定路径的fxml。 Java: FXML: 我做错了什么?请帮帮忙。
是的,我知道这个问题经常被问到,我使用了搜索功能,但不能解决我的问题与这些答案,现在我累了搜索谷歌或其他任何地方。 我的FXML文件在包de.toxiclab.jnotepad.layout中,这意味着Layout/main_layout.FXML中的路径是真实的,所以路径必须是正确的。 然后它给我打印了一个丑陋的例外: javafx.fxml.loadException:/j:/eclipse%