【问题标题】:Error when trying to pass a variable to another controller in javafx/scenebuilder尝试将变量传递给 javafx/scenebuilder 中的另一个控制器时出错
【发布时间】:2018-10-17 15:01:53
【问题描述】:

我正在制作一个简单的程序,其中我试图将一个字符串从 TextField 添加到另一个场景中的 ListView。问题是当我将字符串传递给将其添加到列表的方法时,我得到了 NullPointerException。

这里是主场景控制器的代码:

import java.io.IOException;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class MainPageController {

@FXML TextField txtfield;

public void addButton(ActionEvent event) {

    String a=txtfield.getText();
    FXMLLoader loader= new FXMLLoader();
    loader.setLocation(getClass().getResource("/progra/view/ListView.fxml"));
    ListController obj=loader.getController();
    obj.addList(a);// <----NullPointerException

}

public void openList(ActionEvent event) throws IOException {

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/program /view/ListView.fxml"));
    Parent root1 = (Parent) fxmlLoader.load();
    Stage stage = new Stage();
    stage.setScene(new Scene(root1));  
    stage.show();

}
}

列表场景的控制器代码如下:

import javafx.fxml.FXML;
import javafx.scene.control.ListView;

public class ListController{

@FXML
ListView<String> listofstrs;

public void addList(String a) {

    listofstrs.getItems().add(a);

}
}

我需要做什么来修复它?如果我可以添加,是否可以将变量添加到另一个舞台/场景中的 ListView(或任何其他文本容器)而不打开它所在的舞台/场景,当你打开它时你会看到你添加的东西?如果是这样,我需要添加什么?

【问题讨论】:

  • 哪一行抛出NullPointerException?你确定你的FXML 定义了一个名为listofstrsListView 吗?附带说明一下,请学习 Java 命名约定并遵守它们(对象引用应为驼峰式:listOfStrs)。它可以帮助我们帮助您:)
  • obj.addList(a);
  • 那么显然你的obj 对象是null。您是否使用 ListView.fxml 文件中的 fx:controller 标记定义了控制器?
  • 不...你是怎么做到的,你是什么意思?编辑:是的,我是通过 SceneBuilder 完成的
  • 我不知道这是否是问题所在,但每次我使用这种方法时,我都会在loader.getController(); 之前的某个地方调用loader.load();

标签: java eclipse javafx scenebuilder


【解决方案1】:

因为您正在调用 getController() 方法,并且控制器未在 Java 源代码中设置,所以您必须在 fxml 文件中定义控制器。可以发一下fxml源码吗?

在您的 fxml 中,您的根元素应将 fx:controller 属性设置为控制器的类路径,例如:

fx:controller="com.class.path.to.ListController

【讨论】:

  • 恐怕你的观点都不正确。控制器类可以任意命名。此外,您可以在任何加载程序对象上调用 getController(),无论控制器是在 FXML 中定义还是使用 setController() 方法。 (虽然在 OP 的情况下,你是正确的,只是一般来说)
  • 我删除了反对票,但这仍然应该是评论,而不是答案,因为您要求提供更多信息:)
  • 是的,谢谢,我跳过了必须在 FXML 中定义控制器的原因。关于命名控制器约定,我将这种获取控制器实例的方法与使用 @FXML 注释混为一谈,这确实需要特定的类名 stackoverflow.com/a/44470823/9197327
  • 有趣。我从来没有遇到过这个问题,但我也从未在我的项目中使用过fx:include。好信息:)
猜你喜欢
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2016-05-30
  • 2020-04-13
  • 1970-01-01
  • 2015-04-01
相关资源
最近更新 更多