JavaFX在控制器外部检索TextView值

JavaFX在控制器外部检索TextView值,java,javafx,Java,Javafx,编辑:对于任何未来阅读本文的人,您需要将参数添加到我在帖子中展示的方法中。 您不必使用参数+执行+文本视图+,而是使用参数+执行+,然后在控制器中,为参数创建整数/字符串,并将它们设置为文本视图.getText(),然后将这些整数/字符串放入从控制器类中的实例获取的方法的方法参数中 原创帖子 如何从控制器类之外的另一个类中的方法中的TextView获取值? 我不能使用textview.getText()在控制器类之外,否则它只会给我NullPointerException 这是我的另一个班级的方

编辑:对于任何未来阅读本文的人,您需要将
参数
添加到我在帖子中展示的方法中。 您不必使用参数+执行
+文本视图+
,而是使用参数+执行
+,然后在
控制器中,为
参数
创建
整数/字符串
,并将它们设置为
文本视图.getText()
,然后将这些
整数/字符串
放入从
控制器
类中的实例获取的方法的
方法参数

原创帖子 如何从控制器类之外的另一个类中的方法中的
TextView
获取值? 我不能使用
textview.getText()
控制器
类之外,否则它只会给我
NullPointerException

这是我的另一个班级的方法:

    Controller c;
public void createRecipes() throws SQLException {
    openDB();
    if (connectionDB != null) {
        Statement st = this.connectionDB.createStatement();
        String insert = "INSERT INTO recipes "
                + " (ID, name, temperature, fan, redlight, bluelight, addwater) " + " VALUES "
                + " ( " + c.createID.getText() + ", " + c.createName.getText() + ", " +c. createTemperature.getText() + ", " + c.createFan.getText() + ", " + c.createRedLight.getText() + ", " + c.createBlueLight.getText() + ", " + c.createWaterLevel.getText() + " ) ;";

        st.executeUpdate(insert);
    } else {
        System.out.println("No connection established to the database.");
    }
    closeDB();
}
这是我从控制器类获得的文本字段:

c.createBlueLight.getText() 

您不应该在控制器之外使用fx组件!您应该始终将逻辑和ui分开。因此,只需将文本内容传递给该方法。

这是一个通过解析来自
fxmloader的FXML文件来访问控制器的正确方法示例

public class Controller {

    @FXML
    private TextField textField;

    public TextField getTextField() {
        return textField;
    }

    public String getTextFieldValue() {
        return textField.getText();
    }

}

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
        Parent root = loader.load();
        Controller controller = loader.getController();

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


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

}
因此,控制器已正确初始化(例如,
textField
字段不为空),我们可以毫无问题地使用它

TextField textField = controller.getTextField();


请提供完整的例外情况。请在问题内以文本形式发布相关代码。如何初始化控制器?你的问题是如何访问控制器,我不使用任何初始值设定项,我只是创建一个控制器类的实例,如上图所示,控制器c;这是错误的!你需要得到一个FXMLLoader的实例(或者给它一个,但它更像是一个用户组件)?我在方法中使用JDBC和INSERT语句,它们不应该在SQL类中吗?是的,使用另一个类就可以了,你确实应该这样做!但是,当调用方法时,只需像这样传递内容:方法(textview.getText());但问题是我需要使用TextView值来插入数据,所以它们需要使用相同的方法。我已经发布了我的方法。但是您正在从控制器调用该方法,对吗?为什么不更改方法的参数来传递文本内容呢?不要使用c.createID.getText(),只需使用传递的参数!这确实有效!我只需要一些参数,谢谢!你是个英雄!不要将UI组件暴露在控制器之外。另外,最后一个代码块中第一行的用途是什么?我回答了OP的问题,它是如何使用自动生成的控制器。它是在控制器之外使用UI元素还是使用其他元素(这两个示例说明了这一点)不是我的问题。这不起作用,它仍然会返回Null。正确的方法是使用上面提到的参数“Aaron Stein 1”。如果没有正确创建fxml文件或控制器(如果不同类型或名称/id不同),则会得到null。
String value = controller.getTextFieldValue();