交换场景时如何使 JavaFX 重新初始化?
How can I make JavaFX re-initialize when Scene is swapped?
我想用 JavaFX 制作一个非常简单的程序。它是这样的:
用户在 TextField 中输入内容
程序在标签上显示输入,但在不同的场景
这是我的代码:
Controller.java
package sample;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javax.xml.soap.Text;
import java.io.IOException;
public class Controller {
//textField in sample.fxml
@FXML
TextField textField;
//label in display.fxml
@FXML
Label label;
String text;
@FXML
public void enter() throws IOException {
text = textField.getText();
Stage stage = (Stage) (textField).getScene().getWindow();
Parent root = FXMLLoader.load(getClass().getResource("display.fxml"));
stage.setResizable(false);
stage.setTitle("Display");
stage.setScene(new Scene(root, 300, 275));
label.setText(text);
}
}
Main.java
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
还有 2 个 FXML 文件包含单个文本字段或单个标签。
但是每当我 运行 这段代码时,就会出现一个 NullPointerException,表明 label 为空,因为它尚未初始化。我该如何解决这个问题?
我相信你应该为 display.fxml 文件(另一个场景)制作另一个控制器。在这个新控制器中,您可以准备一个函数来设置标签值:
DisplayController.java
public class DisplayController {
//label in display.fxml
@FXML
Label label;
public void setLabelText(String s){
label.setText(s);
}
}
并在 Controller.java 中通过调用新的 DisplayController.java
实例编辑 enter()
函数:
@FXML
public void enter() throws IOException {
text = textField.getText();
Stage stage = (Stage) (textField).getScene().getWindow();
FXMLLoader loader = new FXMLLoader.load(getClass().getResource("display.fxml"));
Parent root = loader.load();
DisplayController dc = loader.getController();
//here call function to set label text
dc.setLabelText(text);
stage.setResizable(false);
stage.setTitle("Display");
stage.setScene(new Scene(root, 300, 275));
}
我想用 JavaFX 制作一个非常简单的程序。它是这样的:
用户在 TextField 中输入内容
程序在标签上显示输入,但在不同的场景
这是我的代码:
Controller.java
package sample;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import javax.xml.soap.Text;
import java.io.IOException;
public class Controller {
//textField in sample.fxml
@FXML
TextField textField;
//label in display.fxml
@FXML
Label label;
String text;
@FXML
public void enter() throws IOException {
text = textField.getText();
Stage stage = (Stage) (textField).getScene().getWindow();
Parent root = FXMLLoader.load(getClass().getResource("display.fxml"));
stage.setResizable(false);
stage.setTitle("Display");
stage.setScene(new Scene(root, 300, 275));
label.setText(text);
}
}
Main.java
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
还有 2 个 FXML 文件包含单个文本字段或单个标签。
但是每当我 运行 这段代码时,就会出现一个 NullPointerException,表明 label 为空,因为它尚未初始化。我该如何解决这个问题?
我相信你应该为 display.fxml 文件(另一个场景)制作另一个控制器。在这个新控制器中,您可以准备一个函数来设置标签值:
DisplayController.java
public class DisplayController {
//label in display.fxml
@FXML
Label label;
public void setLabelText(String s){
label.setText(s);
}
}
并在 Controller.java 中通过调用新的 DisplayController.java
实例编辑 enter()
函数:
@FXML
public void enter() throws IOException {
text = textField.getText();
Stage stage = (Stage) (textField).getScene().getWindow();
FXMLLoader loader = new FXMLLoader.load(getClass().getResource("display.fxml"));
Parent root = loader.load();
DisplayController dc = loader.getController();
//here call function to set label text
dc.setLabelText(text);
stage.setResizable(false);
stage.setTitle("Display");
stage.setScene(new Scene(root, 300, 275));
}