JavaFX, excepción de puntero nulo de etiqueta
nullpointerexception label (1)
Tengo el siguiente problema con un programa que estoy escribiendo actualmente, y he buscado en Internet, pero realmente no pude encontrar nada que me ayudara a entender el siguiente problema
Así que dentro de otra clase he escrito un método que ejecuta esto cada vez que se hace clic en el botón de búsqueda y el método se ve así:
public void searchButton(){
try {
new SearchController().display();
} catch (IOException e) {
e.printStackTrace();
}
}
Y luego la clase SearchController se ve algo así (lo simplifiqué aquí):
public class SearchController {
@FXML
private Button cancelButton;
@FXML
private Label what;
private static Stage stage;
private static BorderPane borderPane;
@FXML
public void initialize(){
what.setText("Testing"); // this woks
cancelButton.setOnAction(e -> stage.close());
}
public void display() throws IOException {
stage = new Stage();
stage.setResizable(false);
stage.setTitle("Product search");
stage.initModality(Modality.APPLICATION_MODAL);
FXMLLoader loader = new FXMLLoader();
loader.setLocation(SearchController.class.getResource("Search.fxml"));
borderPane = loader.load();
Scene scene = new Scene(borderPane);
stage.setScene(scene);
//what.setText("Testing") and this doesn''t work
stage.showAndWait();
}
}
¿Puede alguien decirme por qué es posible escribir texto en el método de inicialización (se llama a ese método después de borderPane = loader.load();
línea ... entonces, ¿por qué no funciona si trato de escribir en la etiqueta? después de esa línea?)
Gracias de antemano
FXMLLoader
crea una instancia de la clase especificada en el atributo fx:controller
del elemento raíz de FXML. A continuación, inyecta los elementos definidos en el archivo FXML en la instancia del controlador que creó cuando los atributos fx:id
coinciden con los nombres de los campos. Luego llama al método initialize()
en esa instancia.
Usted crea una instancia del controlador "a mano" con el new SearchController()
. Este no es el mismo objeto creado por FXMLLoader
. Entonces, cuando haya cargado el archivo fxml, tiene dos instancias diferentes de SearchController
. Entonces, si llama a what.setText(...)
desde el método display()
, no lo está llamando en la instancia del controlador creada por el FXMLLoader
. En consecuencia, what
no se ha inicializado en la instancia en la que llama a what.setText(...)
, y obtiene una excepción de puntero nulo.
Dado que FXMLLoader
invoca initialize()
en la instancia que creó, cuando llama a what.setText(...)
desde el método initialize()
, lo está llamando en la instancia creada por el FXMLLoader
, y entonces el FXML- los campos inyectados para esa instancia se han inicializado.