java - 在 borderpane 中心加载新的 fxml

标签 java javafx nullpointerexception fxml

刚开始使用JavaFx(通常也是java的初学者),几天来我一直在尝试让它工作,但我一直无法解决它。我收到一个空指针异常,我知道这里涵盖了该异常: What is a NullPointerException, and how do I fix it?

所以我希望这个问题不会因为重复而被关闭,因为我知道 npe 是什么并且(通常)知道如何解决这个问题。

我也知道(大多数时候)如何躲避它们和/或修复它们(如果发生),但在这种情况下我只是不知道如何解决它。

我还检查了一些有关 fxml 的其他问题,但仍然无法弄清楚。
How to change CenterPane from LeftPane in javaFx borderPane?
switching between panes in BorderPane in javaFX
Loading new fxml in the same scene

在我的应用程序中,我希望有一个 borderpane 作为根,在左侧有三个按钮,根据我按下的按钮,带有 tabpane 的新 fxml 应该在我按下时加载在 borderpane 的中心我得到的按钮是一个 npe,我认为这是因为我没有引用正确的 borderpane,但我看不出哪里出错了。

我想做的是,当我按下 custMenuButton 按钮时,fxml 应该加载并设置为边框 Pane 的中心。

主类

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;
    }     
}

主窗口 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);
    }
}

客户 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
    }     
}

主窗口 View

<?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>

客户查看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>

堆栈跟踪

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)

最佳答案

您不会在加载 MainWindowView.fxml 时创建的 Controller 上调用 setMain(...)。因此,当您尝试执行以下操作时,在 MainWindowController

main.getBorderPane()...

出现空指针异常。

在您的 start() 方法中,您需要以与稍后在 handleCustMenuButton(...) 中相同的方式获取 Controller ,即

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

    // MainWindowController mwc = new MainWindowController();

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

关于java - 在 borderpane 中心加载新的 fxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48425065/

相关文章:

java - tomcat servlet 中的内部服务器错误

macos - 剪裁时打印像素化

java - 使用 ObservableMap 填充并同步 ComboBox?

java - 返回 null 的方法导致 java.lang.NullPointerException

java - Java 线程的恼人行为

java - 如何检查字符串是否为正则表达式

java - 如何向JTable中插入数据?

java - 子窗口关闭后是否可以在父窗口中执行操作JavaFX

将图像显示到 JFrame 时出现 java.lang.NullPointerException

java - StringSpacer 方法中出现空指针异常错误