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

调用控制器中的字段时,JavaFX中的NPE

傅砚
2023-03-14

我想让我的未装饰的场景可以拖拉。我的根布局包含带有控件和内容的工具栏。我为工具栏提供了id,并为其设置了控制器。fxml布局。然后我做了所有的步骤,比如在JavaFX中拖动一个未修饰的阶段,但当我尝试调用EffectUtilities时,我有空指针。makeDraggable(舞台、工具栏);代码如下:

主要的

    public class UpdaterMain extends Application{

    private Stage primaryStage;
    private BorderPane rootLayout;

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;
        this.primaryStage.initStyle(StageStyle.UNDECORATED);
        this.primaryStage.initStyle(StageStyle.TRANSPARENT);

        initRootLayout();
        showContentOverview();

    }

    /**
     * Initializes the root layout.
     */
    public void initRootLayout() {
        try {
            // Load root layout from fxml file.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(UpdaterMain.class.getResource("RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();

            // Show the scene containing the root layout.
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);

            UpdaterMainController controller =
                    loader.getController();
            controller.registerStage(primaryStage); <<--Here is NPE

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

    /**
     * Shows main content
     */
    public void showContentOverview() {
        try {
            // Load person overview.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(UpdaterMain.class.getResource("updater-layout.fxml"));
            SplitPane contentOverview = loader.load();

            // Set person overview into the center of root layout.
            rootLayout.setCenter(contentOverview);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Stage getPrimaryStage() {
        return primaryStage;
    }

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

控制

import com.iminegination.utils.EffectUtilities;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.stage.Stage;

public class UpdaterMainController {
    @FXML
    private ToolBar tool_bar;

    public void registerStage(Stage stage) {
        EffectUtilities.makeDraggable(stage, tool_bar); <<--Here is NPE (tool_bar is null, but why?)
    }

    public UpdaterMainController() {
    }
}

layout.fxml

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="690.0" prefWidth="1024.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.iminegination.updater.view.UpdaterMainController">
   <top>
      <ToolBar id="tool_bar" nodeOrientation="RIGHT_TO_LEFT" prefHeight="40.0" prefWidth="200.0">
        <items>
          <Button id="exitButton" mnemonicParsing="false" text="X" onAction="#click"/>
            <Button mnemonicParsing="false" text="Settings" />
            <Button mnemonicParsing="false" text="_" />
        </items>
      </ToolBar>
   </top>
</BorderPane>

共有1个答案

虞裕
2023-03-14

您需要为FXML中的控件定义一个fx: id属性。

在FXML中,您有:

<ToolBar id="tool_bar" . . .

您应该:

<ToolBar id="tool_bar" fx:id="tool_bar" . . .

id定义CSS id。

fx:id定义了FXML和控制器变量名之间的链接。

 类似资料:
  • 和访问字段,如: 因为我希望有更好的方法来做到这一点。

  • 这让我的头撞到了墙上!!!!希望有人能给我指出正确的方向。我确信我在做一些完全愚蠢的事情。我找了又找,但似乎找不出为什么这不管用!!(在IntelliJ IDE 15.x上使用JDK8.x和Scenebuilder)。我试图在GUI上显示数据,但希望access通过编程将这些数据从其他类/方法发送给它。。。。下面是一个简单的概念,我在着手更大的项目之前,正试图让它发挥作用: 我的简单GUI在FXM

  • null 我在TopMenuButtons中有一个按钮,它具有openAssisstantStage()方法,打开新的小阶段: 对于这个阶段,我还有FXML文件和控制器(AssisstantController)。只有2个按钮-第一个按钮应该打开前一个阶段和关闭电流,但第二个按钮也应该打开普雷沃阶段,关闭电流,也打开一个特定的标签在我的标签视图和做一些其他逻辑例如。获取实际localDate: 我

  • 背景:我创建了一个JavaFX应用程序,使用JFXPanel嵌入到Swing框架中。我一直在使用Eclipse作为IDE。“主应用程序”是另一个类,它仅用于创建一个类的实例,该类扩展 以在实例化时加载我的 .fxml 文件。从 Eclipse 执行主类时,一切都很好,我的 .fxml 文件中指定的 fx:controller 有它的 方法调用(我可以从它在加载时对 UI 所做的更改中看出),并且没

  • 问题内容: 我有一个具有自己的控制器的指令。请参见以下代码: 这旨在成为错误/通知/警告的通知系统。我想做的是从另一个控制器(不是指令控制器)调用此控制器上的函数。当我这样做时,我还希望我的链接函数检测到某些属性已更改并执行了一些动画。 这是一些代码来举例说明我要的内容: 所以打电话时开启指令控制器,链接功能也应该被触发,执行动画。我该如何实现? 问题答案: 这是一个有趣的问题,我开始考虑如何实现

  • 问题内容: 使用SceneBuilder。我有2个阶段,每个阶段都有一个控制器: , 。 Stage1Controller: Stage2Controller: 这是使用2种方法 (称为in 方法)将这两个fxml文件加载到Main.java类中的方式: 该方法在第一阶段中用作方法,它在两个阶段都转换视图。 如何输入方法?谢谢 问题答案: “快速又脏”的方法是给的引用: 现在在您的主应用程序中: