在不同场景中输入的新场景中更改标签文本(javafx)
Change label text in a new scene which was entered in different scene (javafx)
我正在尝试更改标签中的文本,该文本是在不同场景的文本字段中输入的。
我制作了 2 个 FXML 文件,第一个包含一个文本字段和 "ok" 按钮,第二个包含一个标签(带有文本 "Label")。
我的目标是在文本字段中输入文本,当我按 "ok"-> 打开新场景时,标签会将其文本更改为我在文本字段中输入的文本。
当标签、文本字段和确定按钮都在同一个场景中时,我很容易更改标签文本,但是当我在打开一个新场景时这样做时,我失败了……
经过一些研究,我为每个 FXML 文件制作了一个控制器,以及一个 "MainController" 将在它们之间进行通信。
这是我的主要 class:
public class MainBanana extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("view/Welcome.fxml"));
Scene scene = new Scene(root);
primaryStage.setTitle("MokaApp");
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.setResizable(false);
}
public static void main(String[] args) {
launch(args);
}
}
我的第一个场景控制器:
public class WelcomeController {
@FXML
public TextField nameField;
@FXML
private Button okButton;
private MainController main;
@FXML
public void okClicked(ActionEvent event) throws IOException{
Parent root = FXMLLoader.load(getClass().getResource("Person.fxml"));
okButton.getScene().setRoot(root);
System.out.println(nameField.getText());
main.setLblFromTf(nameField.getText());
}
public void init(MainController mainController) {
main=mainController;
}
}
第二个场景控制器:
public class PersonController {
@FXML
public Label nameLabel;
private MainController main;
public void init(MainController mainController) {
main=mainController;
}
}
当我启动程序时,欢迎场景打开,我在文本字段中输入文本,但是每当我按下 "ok" 按钮时,场景就会切换到第二个场景,但标签文本保持不变相同的(标签),我在这一行(位于 WelcomeController 中)得到一个 nullpointerexception 错误:main.setLblFromTf(nameField.getText());
抱歉这么久post..
您不需要到处引用 MainController
。
最简单的方法是:
public class PersonController {
@FXML
private Label nameLabel ;
public void setName(String name) {
nameLabel.setText(name);
}
}
那你可以做
public class WelcomeController {
@FXML
private TextField textField ;
@FXML
private Button okButton ;
@FXML
public void okClicked() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Person.fxml"));
Parent root = loader.load();
PersonController personController = loader.getController();
personController.setName(textField.getText());
okButton.getScene().setRoot(root);
}
}
我正在尝试更改标签中的文本,该文本是在不同场景的文本字段中输入的。 我制作了 2 个 FXML 文件,第一个包含一个文本字段和 "ok" 按钮,第二个包含一个标签(带有文本 "Label")。 我的目标是在文本字段中输入文本,当我按 "ok"-> 打开新场景时,标签会将其文本更改为我在文本字段中输入的文本。 当标签、文本字段和确定按钮都在同一个场景中时,我很容易更改标签文本,但是当我在打开一个新场景时这样做时,我失败了…… 经过一些研究,我为每个 FXML 文件制作了一个控制器,以及一个 "MainController" 将在它们之间进行通信。 这是我的主要 class:
public class MainBanana extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("view/Welcome.fxml"));
Scene scene = new Scene(root);
primaryStage.setTitle("MokaApp");
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.setResizable(false);
}
public static void main(String[] args) {
launch(args);
}
}
我的第一个场景控制器:
public class WelcomeController {
@FXML
public TextField nameField;
@FXML
private Button okButton;
private MainController main;
@FXML
public void okClicked(ActionEvent event) throws IOException{
Parent root = FXMLLoader.load(getClass().getResource("Person.fxml"));
okButton.getScene().setRoot(root);
System.out.println(nameField.getText());
main.setLblFromTf(nameField.getText());
}
public void init(MainController mainController) {
main=mainController;
}
}
第二个场景控制器:
public class PersonController {
@FXML
public Label nameLabel;
private MainController main;
public void init(MainController mainController) {
main=mainController;
}
}
当我启动程序时,欢迎场景打开,我在文本字段中输入文本,但是每当我按下 "ok" 按钮时,场景就会切换到第二个场景,但标签文本保持不变相同的(标签),我在这一行(位于 WelcomeController 中)得到一个 nullpointerexception 错误:main.setLblFromTf(nameField.getText());
抱歉这么久post..
您不需要到处引用 MainController
。
最简单的方法是:
public class PersonController {
@FXML
private Label nameLabel ;
public void setName(String name) {
nameLabel.setText(name);
}
}
那你可以做
public class WelcomeController {
@FXML
private TextField textField ;
@FXML
private Button okButton ;
@FXML
public void okClicked() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Person.fxml"));
Parent root = loader.load();
PersonController personController = loader.getController();
personController.setName(textField.getText());
okButton.getScene().setRoot(root);
}
}