Javafx-将FXML组件加载到选项卡上时FXML加载异常
我想拥有一个带有标签的页面,在每个选项卡中,我将调用另一个FXML组件。我已经尝试了很多答案,它们都不对我有用。我的TABPANE为home.fxml
的主页以及我要调用的选项卡之一,我要调用view.fxml
。现在,我正在尝试这种方法:
home.fxml页面:
<VBox xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
prefHeight="${screen.visualBounds.height}"
fx:controller="pkg.magazineservice.home_controller"
fx:id="wrapper">
<fx:define>
<Screen fx:factory="getPrimary" fx:id="screen" />
</fx:define>
<VBox style="-fx-background-color: #003d80" alignment="CENTER" prefHeight="${wrapper.height * 0.10}" >
<Label BorderPane.alignment="CENTER" style="-fx-text-fill: white" text="Magazine Service" >
<font>
<Font size="32" />
</font>
</Label>
</VBox>
<TabPane style="-fx-close-tab-animation: none" fx:id="contentWrapper" prefHeight="${wrapper.height * 0.9}" prefWidth="${screen.visualBounds.width}">
<Tab fx:id="View" text="View">
<VBox>
<!--<fx:include source="view.fxml" />-->
</VBox>
</Tab>
<Tab fx:id="Create" text="Create">
<VBox>
<!--<fx:include source="view.fxml" />-->
</VBox>
</Tab>
<Tab fx:id="Edit" text="Edit">
<VBox>
<!--<fx:include source="view.fxml" />-->
</VBox>
</Tab>
</TabPane>
On it's controller, I'm trying to initialize a page:home_controller.java
@Override
public void initialize(URL location, ResourceBundle resources)
{
try
{
Tab tab = new Tab();
View.setContent((Node) FXMLLoader.load(this.getClass().getResource("view.fxml")));
}
catch(IOException iex)
{
System.out.println(iex.getCause().toString());
System.out.println("File not found");
}
}
但是,它一直在扔JavanullPoInterException
。
这是view.fxml
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.stage.Screen?>
<VBox xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
fx:id="View"
alignment="CENTER"
prefHeight="${screen.height * 0.9}"
prefWidth="${screen.visualBounds.width}"
fx:controller="pkg.magazineservice.view_controller"
>
<fx:define>
<Screen fx:factory="getPrimary" fx:id="screen" />
</fx:define>
<VBox fx:id="listsWrapper" alignment="CENTER" prefHeight="${View.height}" prefWidth="${View.width * 0.50}">
<VBox>
</VBox>
<Separator orientation="HORIZONTAL" prefWidth="${listsWrapper.width}" style="-fx-background-color: black" />
<VBox>
</VBox>
<Separator orientation="VERTICAL" prefHeight="${View.height}" style="-fx-background-color: black" />
<VBox fx:id="detailsWrapper" alignment="CENTER" prefHeight="${View.height}" prefWidth="${View.width * 0.50}">
</VBox>
</VBox>
我已经尝试使用fx:root
,但它一直抱怨root未被设置,我不知道如何在家中实现root控制器。任何帮助和建议都很棒!
编辑: StackTrace:
javafx.fxml.LoadException:
/MagazineService/target/classes/pkg/magazineservice/view.fxml:40
at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
at com.magazineservice.magazineservice/pkg.magazineservice.home_controller.initialize(home_controller.java:40)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2573)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at com.magazineservice.magazineservice/pkg.magazineservice.HelloApplication.start(HelloApplication.java:25)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.NullPointerException
at javafx.fxml/com.sun.javafx.fxml.expression.Expression.lambda$multiply$2(Expression.java:928)
at javafx.fxml/com.sun.javafx.fxml.expression.BinaryExpression.evaluate(BinaryExpression.java:55)
at javafx.fxml/com.sun.javafx.fxml.expression.ExpressionValue.getValue(ExpressionValue.java:192)
at javafx.base/com.sun.javafx.binding.ExpressionHelper.addListener(ExpressionHelper.java:53)
at javafx.base/javafx.beans.value.ObservableValueBase.addListener(ObservableValueBase.java:55)
at javafx.fxml/com.sun.javafx.fxml.expression.ExpressionValue.addListener(ExpressionValue.java:201)
at javafx.base/javafx.beans.binding.DoubleBinding.bind(DoubleBinding.java:152)
at javafx.base/javafx.beans.property.DoublePropertyBase$ValueWrapper.<init>(DoublePropertyBase.java:277)
at javafx.base/javafx.beans.property.DoublePropertyBase$2.<init>(DoublePropertyBase.java:182)
at javafx.base/javafx.beans.property.DoublePropertyBase.bind(DoublePropertyBase.java:182)
at javafx.graphics/javafx.css.StyleableDoubleProperty.bind(StyleableDoubleProperty.java:75)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processPropertyAttribute(FXMLLoader.java:326)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processInstancePropertyAttributes(FXMLLoader.java:242)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:775)
at javafx.fxml/javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2838)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2557)
... 21 more
I want to have a page with tabs and in each tab I will call another FXML component. I've already tried so many answers and none of them worked for me. The main page where my TabPane is home.fxml
and in one of the tabs I want to call view.fxml
. Right now, I'm trying this approach:
home.fxml page:
<VBox xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
prefHeight="${screen.visualBounds.height}"
fx:controller="pkg.magazineservice.home_controller"
fx:id="wrapper">
<fx:define>
<Screen fx:factory="getPrimary" fx:id="screen" />
</fx:define>
<VBox style="-fx-background-color: #003d80" alignment="CENTER" prefHeight="${wrapper.height * 0.10}" >
<Label BorderPane.alignment="CENTER" style="-fx-text-fill: white" text="Magazine Service" >
<font>
<Font size="32" />
</font>
</Label>
</VBox>
<TabPane style="-fx-close-tab-animation: none" fx:id="contentWrapper" prefHeight="${wrapper.height * 0.9}" prefWidth="${screen.visualBounds.width}">
<Tab fx:id="View" text="View">
<VBox>
<!--<fx:include source="view.fxml" />-->
</VBox>
</Tab>
<Tab fx:id="Create" text="Create">
<VBox>
<!--<fx:include source="view.fxml" />-->
</VBox>
</Tab>
<Tab fx:id="Edit" text="Edit">
<VBox>
<!--<fx:include source="view.fxml" />-->
</VBox>
</Tab>
</TabPane>
On it's controller, I'm trying to initialize a page:
home_controller.java
@Override
public void initialize(URL location, ResourceBundle resources)
{
try
{
Tab tab = new Tab();
View.setContent((Node) FXMLLoader.load(this.getClass().getResource("view.fxml")));
}
catch(IOException iex)
{
System.out.println(iex.getCause().toString());
System.out.println("File not found");
}
}
However, it keeps throwing a JavaNullPointerException
.
This is view.fxml
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.stage.Screen?>
<VBox xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1"
fx:id="View"
alignment="CENTER"
prefHeight="${screen.height * 0.9}"
prefWidth="${screen.visualBounds.width}"
fx:controller="pkg.magazineservice.view_controller"
>
<fx:define>
<Screen fx:factory="getPrimary" fx:id="screen" />
</fx:define>
<VBox fx:id="listsWrapper" alignment="CENTER" prefHeight="${View.height}" prefWidth="${View.width * 0.50}">
<VBox>
</VBox>
<Separator orientation="HORIZONTAL" prefWidth="${listsWrapper.width}" style="-fx-background-color: black" />
<VBox>
</VBox>
<Separator orientation="VERTICAL" prefHeight="${View.height}" style="-fx-background-color: black" />
<VBox fx:id="detailsWrapper" alignment="CENTER" prefHeight="${View.height}" prefWidth="${View.width * 0.50}">
</VBox>
</VBox>
I've already tried using fx:root
but it kept complaining about root not being set and I had no idea how to implement the root from home controller. Any help and advice would be awesome!
Edit:
StackTrace:
javafx.fxml.LoadException:
/MagazineService/target/classes/pkg/magazineservice/view.fxml:40
at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
at com.magazineservice.magazineservice/pkg.magazineservice.home_controller.initialize(home_controller.java:40)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2573)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
at com.magazineservice.magazineservice/pkg.magazineservice.HelloApplication.start(HelloApplication.java:25)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.NullPointerException
at javafx.fxml/com.sun.javafx.fxml.expression.Expression.lambda$multiply$2(Expression.java:928)
at javafx.fxml/com.sun.javafx.fxml.expression.BinaryExpression.evaluate(BinaryExpression.java:55)
at javafx.fxml/com.sun.javafx.fxml.expression.ExpressionValue.getValue(ExpressionValue.java:192)
at javafx.base/com.sun.javafx.binding.ExpressionHelper.addListener(ExpressionHelper.java:53)
at javafx.base/javafx.beans.value.ObservableValueBase.addListener(ObservableValueBase.java:55)
at javafx.fxml/com.sun.javafx.fxml.expression.ExpressionValue.addListener(ExpressionValue.java:201)
at javafx.base/javafx.beans.binding.DoubleBinding.bind(DoubleBinding.java:152)
at javafx.base/javafx.beans.property.DoublePropertyBase$ValueWrapper.<init>(DoublePropertyBase.java:277)
at javafx.base/javafx.beans.property.DoublePropertyBase$2.<init>(DoublePropertyBase.java:182)
at javafx.base/javafx.beans.property.DoublePropertyBase.bind(DoublePropertyBase.java:182)
at javafx.graphics/javafx.css.StyleableDoubleProperty.bind(StyleableDoubleProperty.java:75)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processPropertyAttribute(FXMLLoader.java:326)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processInstancePropertyAttributes(FXMLLoader.java:242)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:775)
at javafx.fxml/javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2838)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2557)
... 21 more
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
多亏了@james_d的评论,他指出
prefwidth
和prefheight
是问题所在。只需从view.fxml
删除这些行就解决了我的问题。解决方案:
Thanks to @James_D comments, he pointed me out that
prefWidth
andprefHeight
were the problem. Simply removing those lines fromview.fxml
solved my problem.Solution: