Javafx-将FXML组件加载到选项卡上时FXML加载异常

发布于 2025-02-03 06:53:25 字数 6846 浏览 4 评论 0原文

我想拥有一个带有标签的页面,在每个选项卡中,我将调用另一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水水月牙 2025-02-10 06:53:25

多亏了@james_d的评论,他指出prefwidthprefheight是问题所在。只需从view.fxml删除这些行就解决了我的问题。

解决方案:

<VBox xmlns="http://javafx.com/javafx/8"
 xmlns:fx="http://javafx.com/fxml/1"
 fx:id="View"
 alignment="CENTER"
 fx:controller="pkg.magazineservice.view_controller"
 >
<!-- NO WIDTH AND HEIGHT-->

Thanks to @James_D comments, he pointed me out that prefWidth and prefHeight were the problem. Simply removing those lines from view.fxml solved my problem.

Solution:

<VBox xmlns="http://javafx.com/javafx/8"
 xmlns:fx="http://javafx.com/fxml/1"
 fx:id="View"
 alignment="CENTER"
 fx:controller="pkg.magazineservice.view_controller"
 >
<!-- NO WIDTH AND HEIGHT-->
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文