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

Posted

技术标签:

【中文标题】java文件中的setText如何更新fxml文件中的文本字段?【英文标题】:How can a textfield from fxml file be updated by setText in java file? 【发布时间】:2015-01-10 00:38:33 【问题描述】:

我希望根据某个值更新文本字段中的文本。为了使这个示例更简单,我使我的程序更小。问题似乎出在我把 top.setText("This is my new Text");

我看了这个: how to change the text of TextField in java fx 2

但答案似乎没有意义。我不知道你为什么要初始化一个已经实现的文本字段。无论如何它没有工作。

我还看过: 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();
        */

    

从网上阅读我想知道是否存在竞争条件: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");
  
);

但这没有用。我知道它可以在 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) 
         
    

    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>

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);
      

【问题讨论】:

【参考方案1】:

您不能在控制器类 (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");
     

首先尝试使用您发布的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);
     


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

@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");

【讨论】:

你提到的第一和第三件事效果很好。我现在可以初始化该字段,并且可以在开始时设置它。我确实必须将 top 变量更改为 public 而不是 controller.setText("New Text");我做了 controller.top.setText("New Text");但是,我似乎无法理解第二部分。使用新的 setTopText 方法时出现 NullPointerException。 我的代码中有一个错字,应该是controller.setTopText("New Text");(我会修正它)。它现在应该可以工作了,无需公开top。关于 NPE,你从哪里调用 setTopText? 好吧,这显然是一个漫长的夜晚,我放错了课。所以问题纠正了错误的打字。非常感谢您抽出宝贵时间。

以上是关于java文件中的setText如何更新fxml文件中的文本字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何引用资源文件夹中的 javafx fxml 文件?

如何使用不同的 fxml 文件创建多个 javafx 控制器?

是否可以从android中的另一个Java文件编写setText?

QLineEdit 不使用 setText 更新

使用fxml文件和Controller在Java fx中切换场景

如何填充在 JavaFx Scene Builder 中设计的 fxml 文件中定义的 TableView