当前位置: 首页 > 知识库问答 >
问题:

JavaFX+MVC。更改BorderPane和NullPointerException中的中心

符鸣
2023-03-14

我有2个控制器和3个fxml文件。
1。控制器:
MainController.java
在这个控制器中,我使用BorderPane创建舞台和场景。在BorderPane的中心,我想改变布局(GridPane,HBox等)

public class MainController {

    //Main BorderPane
    private BorderPane borderPane;

    @FXML
    private void initialize() {
       try {

          FXMLLoader  mainLoaderFXML = new FXMLLoader();
          mainLoaderFXML.setLocation(getClass().getResource("BaseView.fxml"));
          borderPane = (BorderPane) mainLoaderFXML.load();

          Stage mainStage = new Stage();
          mainStage.setTitle("Border Pane");

          Scene mainScene = new Scene(borderPane);
          mainStage.setScene(mainScene);

          FXMLLoader loader = new FXMLLoader();
          loader.setLocation(getClass().getResource("CenterView1.fxml"));

          //BorderPane in CenterView1.fxml          
          BorderPane centerView1 = (BorderPane) loader.load();

          borderPane.setCenter(centerView1);

          mainStage.show();


       } catch (IOException e) {
          e.printStackTrace();
       }

    }

    //Get BorderPane
    public BorderPane getBorderPane() {
         return this.borderPane;
    }

}

java
在SecondController中,我想用帮助RadioButton更改borderPane MainController的中心。

public class SecondController {
    @FXML
    private ToggleGroup radioButtons;

    @FXML
    private void initialize() {

        radioButtons.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
            public void changed(ObservableValue<? extends Toggle> ov,
                Toggle old_toggle, Toggle new_toggle) {
                if (radioButtons.getSelectedToggle() != null) {
                    RadioButton chk = (RadioButton)new_toggle.getToggleGroup().getSelectedToggle(); 

                    switch(chk.getText()){
                        case "rbFirst": 
                            System.out.println("Default View CenterView1"); 
                            break;
                        case "rbSecond": 

                            FXMLLoader  mainLoaderFXML = new FXMLLoader();
                                mainLoaderFXML.setLocation(getClass().getResource("BaseView.fxml"));

                                MainController mainController = (MainController)mainLoaderFXML.getController();

                                //And now i want to change new FXML-file into center, but i have a NULLPointerException
                                System.out.println(mainController.getDefaultNormsLayout().setCenter("CenterView2"));
                            break;
                    }
                }
            }
        });
    }
}


2。fxml-file:
0.baseView.fxml-base view
1。centerview1.fxml(默认情况下)-它位于基本视图
2中心的BorderPane。centerview2.fxml-它是基本视图中心的DataGrid

当我单击rbSecond时,我在mainController.getDefaultNormsLayout()中看到NullPointerException。我知道它是什么,但我不知道如何修理它。我使用JavaFX类控制器场景引用,在这里输入链接描述等,但我不知道如何应用于我的任务。
谢谢!

共有1个答案

穆劲
2023-03-14

从我的评论中回答:

nullpointer会出现,因为在FXMLLoader的加载操作之前没有初始化控制器。这将创建MainController类的另一个实例。如果没有覆盖默认的JavaFX,则该实例将与初始实例不同。请参见FXMLLoader类的setControllerFactory方法。请记住,不要重用FXMLLoader类是很重要的。

以下内容应确保mainController不再为null。

FXMLLoader  mainLoaderFXML = new FXMLLoader(); 
mainLoaderFXML.setLocation(getClass().getResource("BaseView.fxml"));
mainLoaderFXML.load();
MainController mainController =  (MainController)mainLoaderFXML.getController();
mainLoaderFxml.setControllerFactory(new Callback() {
     public Object call(Class<?> clazz) {
          return instance of your class;
     }
}
 类似资料:
  • 我的BorderPane的中心有一个名为designView的堆栈窗格(FXML定义的堆栈窗格)。我试图在designView中获得一个可拖动的窗格。如果我将该窗格添加到rootView(我的BordePane)中,一切都很好。但是,如果我尝试将其添加到designView中,如下所示: 窗格在设计视图中显示正确,但不再可拖动。MouseEvents会触发,但窗格的位置没有更新。我认为问题在于la

  • 我试图在javafx中制作一个面板,我习惯了一个边框窗格作为一个主要场景。中央面板有4个窗口(main1、main2、main3、main4),左面板有一个导航菜单。

  • 我看到下面的链接-https://stackoverflow.com/questions/5302197/javafx-bug-is-there-a-way-to-force-repaint-this-not-a-single-threading-pr调用requestLayout似乎没有帮助。我还尝试在图中的各个节点上调用impl_updatePG和impl_transformsChanged。

  • 主要内容:示例,实例-2BorderPane布局顶部,底部,左,右或中心区域中的子节点。每个区域只能有一个节点。BorderPane的顶部和底部区域允许可调整大小的节点占用所有可用宽度。 左边界区域和右边界区域占据顶部和底部边界之间的可用垂直空间。 默认情况下,所有边界区域尊重子节点的首选宽度和高度。放置在顶部,底部,左侧,右侧和中心区域中的节点的默认对齐方式如下: 顶部: 底部: 左侧: 右侧: 中心: 示例 将按钮添

  • 我在将带有3个按钮的VBox放在BorderPane右侧部分的中心时遇到问题。有没有办法在FXML或CSS中实现这一点? 更新: 这是FXML中的代码 这是CSS文件 以及应用程序的屏幕截图。我希望Vbox位于BorderPate右侧部分的中心。非常感谢您的回复!

  • 我有一个简单的JavaFX类,对于这个问题,它的结构是这样的。 BorderPane包含包含FlowPane的StackPane。 几天来,我一直试图让StackPane填充其父级BorderPane,但似乎没有任何效果。最终结果应该是StackPane的背景设置为“红色”。 代码: 我的应用程序正在运行的照片 所以基本上这个左侧区域应该完全填充我的BorderPane的左侧,因此背景应该正确覆盖