简体   繁体   English

在borderpane中心加载新的fxml

[英]Load new fxml in borderpane center

Just started with JavaFx (also a beginner of java generally) and for a few days I've been trying to get this to work but I've been unable to solve it. 刚开始使用JavaFx(通常也是Java的初学者),几天来,我一直在尝试使其工作,但一直无法解决。 I'm getting a null pointer exception which I know is covered here: What is a NullPointerException, and how do I fix it? 我收到一个空指针异常,该异常在这里介绍: 什么是NullPointerException,如何解决?

So I hope this question doesn't get closed as duplicate since I know what npe is and (generally) know how to fix this. 所以我希望这个问题不会因为重复而结束,因为我知道npe是什么,并且(通常)知道如何解决此问题。

I also know (most of the time) how to dodge them and/or fix them if it occurs but in this case I just don't know how to sort it out. 我也(大多数时候)知道如何躲避它们和/或修复它们(如果发生),但是在这种情况下,我只是不知道如何解决它。

I've also checked some other questions regarding fxml but still can't figure is out. 我还检查了有关fxml的其他问题,但仍然无法解决。
How to change CenterPane from LeftPane in javaFx borderPane? 如何从javaFx borderPane中的LeftPane更改CenterPane?
switching between panes in BorderPane in javaFX 在javaFX的BorderPane中的窗格之间切换
Loading new fxml in the same scene 在同一场景中加载新的fxml

In my application I want to have a borderpane as a root and in the left side i have three buttons and depending on what button I press a new fxml with a tabpane should load in the center of the borderpane how ever when i press the button i get a npe which i presume is due to me not referencing the right borderpane but i cant see where i'm going wrong. 在我的应用程序中,我想以borderpane为根,在左侧,我有三个按钮,根据我按的是哪个按钮,按新的fxml和一个tabpane应该在borderpane的中心加载,当我按下按钮时,得到一个我认为是由于我没有参考正确的边框的npe,但我看不到我要去哪里错了。

What I'm trying to do is when i press the button custMenuButton the fxml should load and be set as center in the borderpane. 我想做的是当我按下按钮custMenuButton时,fxml应该加载并设置为borderpane的中心。

Main class 主班

import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Main extends Application {

    @FXML
    private BorderPane root;

    Stage window;

    @Override
    public void start(Stage primaryStage) throws IOException {
        window = primaryStage;
        FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindowView.fxml"));
        this.root = loader.load();

        MainWindowController mwc = new MainWindowController();
        mwc.setMain(this);

        Scene scene = new Scene(root);
        window.setTitle("JavaFX");
        window.setScene(scene);
        window.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    public BorderPane getBorderPane() {
        return root;
    }     
}

Main window controller 主视窗控制器

import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.TabPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;

public class MainWindowController {

    private Main main;

    @FXML private BorderPane root;
    @FXML private VBox sideBox;
    @FXML private Button custMenuButton;
    @FXML private Button accMenuButton;
    @FXML private Button transMenuButton; 

    public void setMain(Main main) {
        this.main = main;
    }

    public void handleCustMenuButton() throws IOException {        
        FXMLLoader loader = new FXMLLoader(getClass().getResource("CustomerView.fxml"));
        TabPane pane = (TabPane) loader.load();

        CustomerViewController cvc = loader.getController();
        cvc.setMain(main);

        main.getBorderPane().setCenter(pane);
    }
}

Customer view controller 客户视图控制器

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;

public class CustomerViewController implements Initializable {

    Main main;
    @FXML private TabPane custTabPane;
    @FXML private Tab createTab;
    @FXML private Tab listAllTab;
    @FXML private Tab deleteTab;

    public void setMain(Main main){
        this.main = main;
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }     
}

Mainwindowview 主窗口视图

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="firstfx.MainWindowController">
   <top>
      <MenuBar BorderPane.alignment="CENTER">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" text="Close" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Help">
            <items>
              <MenuItem mnemonicParsing="false" text="About" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </top>
   <left>
      <VBox fx:id="sideBox" prefHeight="200.0" prefWidth="150.0" spacing="2.0" BorderPane.alignment="CENTER">
         <children>
            <Button fx:id="custMenuButton" mnemonicParsing="false" onAction="#handleCustMenuButton" prefHeight="50.0" prefWidth="130.0" text="Kundmeny" />
            <Button fx:id="accMenuButton" mnemonicParsing="false" prefHeight="50.0" prefWidth="130.0" text="Kontomeny" />
            <Button fx:id="transMenuButton" mnemonicParsing="false" prefHeight="50.0" prefWidth="130.0" text="Transaktioner" />
         </children>
         <padding>
            <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
         </padding>
      </VBox>
   </left>
</BorderPane>

Customer view fxml 客户视图fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>

<TabPane fx:id="custTabPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" tabClosingPolicy="UNAVAILABLE" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="firstfx.CustomerViewController">
  <tabs>
    <Tab fx:id="createTab" text="Skapa kund">
      <content>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
      </content>
    </Tab>
    <Tab fx:id="listAllTab" text="Lista alla kunder">
      <content>
        <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
      </content>
    </Tab>
      <Tab fx:id="deleteTab" text="Radera kund">
        <content>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
        </content>
      </Tab>
  </tabs>
</TabPane>

Stacktrace 堆栈跟踪

Executing /home/garnbutik/NetBeansProjects/FirstFX/dist/run1223809748/FirstFX.jar using platform /home/garnbutik/jdk1.8.0_151/jre/bin/java
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8413)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:417)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 48 more
Caused by: java.lang.NullPointerException
    at firstfx.MainWindowController.handleCustMenuButton(MainWindowController.java:31)
    ... 58 more
BUILD STOPPED (total time: 4 minutes 14 seconds)

You don't call setMain(...) on the controller that is created when you load MainWindowView.fxml . 您不会在加载MainWindowView.fxml时创建的控制器上调用setMain(...) Consequently in MainWindowController when you try to do 因此,当您尝试在MainWindowController中执行此操作时

main.getBorderPane()...

you get a null pointer exception. 您会得到一个空指针异常。

In your start() method, you need to get the controller in the same way you do later in handleCustMenuButton(...) , ie start()方法中,您需要以与稍后在handleCustMenuButton(...)相同的方式获取控制器,即

    FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindowView.fxml"));
    this.root = loader.load();

    // MainWindowController mwc = new MainWindowController();

    MainWindowController mwc = loader.getController();
    mwc.setMain(this);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM