我希望根据某些值更新文本字段中的文本。为了使这个样本更简单,我使我的程序更小。问题似乎是当我把top.setText(“这是我的新文本”);
我看着这个: 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);
}
}
答案 0 :(得分: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");
}
}
首先尝试使用您发布的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");
}