如何通过java文件中的setText更新fxml文件中的文本字段?

eck*_*ama 1 javafx textfield settext

我希望基于某些值更新文本字段中的文本.为了使这个样本更简单,我使我的程序更小.问题似乎是当我把top.setText("这是我的新文本")时;

我看了一下: 如何在java fx 2中更改TextField的文本

但答案似乎没有意义.我不知道为什么要初始化已经实现的文本字段.无论它不起作用.

我还看了一下: NullPointerException(JavaFX Label.setText())

这似乎与我认为的问题最接近,但是当我做了以下操作时,我得到了一个错误.为了清楚起见,这是在JavaFXApplication5类中.

try {
        FXMLLoader loader = new FXMLLoader(
            getClass().getResource("FXML.fxml")
        );
        FXMLLoader.setController(this); // non-static method setController(Object) 
                                        // can not be referenced from static context ERROR****
        Parent root = (Parent) loader.load();
        /*Parent root = FXMLLoader.load(getClass().getResource("FXML.fxml"));

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("java code");
        stage.show();
        */

    }
Run Code Online (Sandbox Code Playgroud)

从网上阅读我想知道是否有竞争条件:http://gotoanswer.stanford.edu/nullpointerexception_in_javafx_initialize_method-8807679/

所以我尝试过:

Platform.runLater(new Runnable() {
  @Override public void run() {
    top.setText("This is my new Text");
  }
});
Run Code Online (Sandbox Code Playgroud)

但那没用.我知道它可以在Scene Builder中设置,但我需要一种方法来根据另一个类的值动态地更改它.如果我能弄清楚如何设置它,我可以弄清楚如何做这个部分.希望这足以得到一些帮助.

    FXMLController Class:
    public class FXMLController implements Initializable {

        @FXML private TextField top;

        public FXMLController() {
            System.out.println("Hi");
            top.setText("This is my new Text"); // This breaks the program *********
        }
        @Override
        public void initialize(URL url, ResourceBundle rb) {
        } 
    }
Run Code Online (Sandbox Code Playgroud)

    FXML.fxml class:
    <?xml version="1.0" encoding="UTF-8"?>

    <?import java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>

    <AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="javafxapplication5.FXMLController">
       <children>
          <TextField fx:id="top" layoutX="171.0" layoutY="68.0" />
       </children>
    </AnchorPane>
Run Code Online (Sandbox Code Playgroud)

JavaFXApplication5 class: // main class
public class JavaFXApplication5 extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("FXML.fxml"));
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle("java code");
            stage.show();
        }
        catch (Exception ex) {
            Logger.getLogger(JavaFXApplication5.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public static void main(String[] args) {
        launch(args);
    }  
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*eda 7

您不能在控制器类(FXMLController)上使用构造函数,因为它将由FXMLLoader启动.

你是对的,第一个链接有错误的答案,因为文本字段将@FXML在此过程中初始化(因为注释).

所以对于初学者来说,你可以在里面的文本字段中添加一些文本initialize,因为它将从加载器开始加载,并且top已经被实例化.

public class FXMLController implements Initializable {

    @FXML private TextField top;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        top.setText("This is my first Text");
    } 
}
Run Code Online (Sandbox Code Playgroud)

首先尝试使用您的发布版本JavaFXApplication5,并检查它是否有效.

有很多方法可以在字段上设置内容,但是如果您需要修改另一个类的文本字段,只需为其添加一个公共方法:

public class FXMLController implements Initializable {

    @FXML private TextField top;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        top.setText("This is my new Text");
    } 

    public void setTopText(String text) {
        // set text from another class
        top.setText(text);
    } 

}
Run Code Online (Sandbox Code Playgroud)

例如,您可以在主类中获取控制器的实例,并在显示阶段后使用它将内容传递到文本字段.这将覆盖以前的内容.

@Override
public void start(Stage stage) throws IOException {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("FXML.fxml"));
    Parent root = loader.load();
    FXMLController controller = (FXMLController)loader.getController();

    Scene scene = new Scene(root);

    stage.setTitle("Java code");
    stage.setScene(scene);
    stage.show();

    controller.setTopText("New Text");
}
Run Code Online (Sandbox Code Playgroud)