我正在创建标签。出于这个原因,我创建了新的FXML文件,用于新的标签。我尝试将此节点(AnchorPane)添加到场景中。当我尝试调用此AnchorPane的TextBox,Label,Button等时,Eclipse会抛出nullponterException。
package mrpuppy.controller.cliente;
import java.io.IOException;
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.RadioButton;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import mrpuppy.DTO.ApplicationContextDTO;
import mrpuppy.entity.Cliente;
import mrpuppy.entity.Mascota;
import mrpuppy.service.ClienteService;
@Controller
public class EditarClienteControllerImpl implements EditarClienteController
{
private Stage primaryStage;
private Scene scene;
private FXMLLoader loader;
private final String css = this.getClass().getResource("/css/editarCliente.css").toExternalForm();
@Autowired
private ClienteService clienteService;
@Autowired
private ListaClientesController listaClientesController;
private int intTabs=0;
private Tab[] openTabs;
@FXML
private TabPane tabPane;
@FXML
private Tab tabMascota;
@FXML
private TextField fieldNombreCliente;
@FXML
private TextField fieldApellidos;
@FXML
private TextField fieldDni;
@FXML
private TextField fieldTelMovil;
@FXML
private TextField fieldTelFijo;
@FXML
private TextField fieldDireccion;
@FXML
private TextField fieldCorreo;
@FXML
private ComboBox<String> comboMascota;
@FXML
private ComboBox<String> comboTamano;
@FXML
private TextField fieldNombreMascota;
@FXML
private RadioButton radioAlergiaSi;
@FXML
private RadioButton radioAlergiaNo;
@FXML
private TextField fieldRaza;
@FXML
private TextField fieldPeso;
@FXML
private ComboBox<String> comboSexo;
@FXML
private ComboBox<String> comboAgresividad;
@FXML
private TextArea areaObservaciones;
@FXML
private Button buttonCancelarEditarCliente;
@FXML
private Button buttonAceptarEditarCliente;
private ApplicationContextDTO applicationContextDTO;
@Override
public void openWindow(Cliente cliente)
{
try
{
primaryStage = new Stage();
primaryStage.setResizable(false);
loader = new FXMLLoader(getClass().getResource("/view/editarCliente.fxml"));
loader.setController(this); //Establecemos esta clase como "controller"
scene = loader.load();
scene.getStylesheets().add(css);
primaryStage.setScene(scene);
primaryStage.initModality(Modality.APPLICATION_MODAL);
primaryStage.show();
rellenarCamposCliente(cliente);
rellenarCamposMascota(cliente);
buttonCancelarEditarCliente.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
primaryStage.close();
}
});
buttonAceptarEditarCliente.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
cliente.setNombre(fieldNombreCliente.getText());
cliente.setApellidos(fieldApellidos.getText());
cliente.setDni(fieldDni.getText());
cliente.setTelefonoMovil(Integer.parseInt(fieldTelMovil.getText()));
cliente.setTelefonoFijo(Integer.parseInt(fieldTelFijo.getText()));
cliente.setDireccion(fieldDireccion.getText());
cliente.setCorreo(fieldCorreo.getText());
clienteService.actualizarCliente(cliente);
primaryStage.close();
}
});
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
}
}
private void rellenarCamposCliente(Cliente cliente)
{
applicationContextDTO = new ApplicationContextDTO();
applicationContextDTO.setClienteService();
clienteService = applicationContextDTO.getClienteService();
fieldNombreCliente.setText(cliente.getNombre());
fieldApellidos.setText(cliente.getApellidos());
fieldDni.setText(cliente.getDni());
fieldTelMovil.setText(String.valueOf(cliente.getTelefonoMovil()));
fieldTelFijo.setText(String.valueOf(cliente.getTelefonoFijo()));
fieldDireccion.setText(cliente.getDireccion());
fieldCorreo.setText(cliente.getCorreo());
return;
}
private void rellenarCamposMascota(Cliente cliente)
{
try
{
AnchorPane anchorPane = new AnchorPane();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/mascotaTab.fxml"));
anchorPane.getChildren().add(loader.load());
Collection<Mascota> mascotas = cliente.getMascotas();
for(Mascota mascota : mascotas)
{
Tab newTab = new Tab();
FXMLLoader loader2 = new FXMLLoader(getClass().getResource("/view/mascotaTab.fxml"));
newTab.setContent(loader2.load());
tabPane.getTabs().add(newTab);
fieldNombreMascota.setText(mascota.getNombre());
fieldRaza.setText(mascota.getRaza());
comboSexo.setValue(mascota.getSexo());
fieldPeso.setText(String.valueOf(mascota.getPeso()));
comboTamano.setValue(mascota.getTamano());
comboAgresividad.setValue(mascota.getAgresividad());
areaObservaciones.setText(mascota.getObservaciones());
}
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
}
}
}
这是场景的fxml文件:
editarCliente.fxml
<Scene width="550" height="350" xmlns:fx="http://javafx.com/fxml">
<BorderPane id="root">
<top>
<TabPane fx:id="tabPane">
<tabs>
<Tab fx:id="tabCliente" text="Cliente" >
<content>
<AnchorPane fx:id="paneCliente">
<VBox fx:id="vBoxBloqueCliente">
<children>
<HBox fx:id="hBoxNombreApellidos">
<children>
<Label fx:id="labelNombre" text="Nombre:"/>
<TextField fx:id="fieldNombreCliente"/>
<Label fx:id="labelApellidos" text="Apellidos:"/>
<TextField fx:id="fieldApellidos"/>
</children>
</HBox>
<HBox fx:id="hBoxDniMovil">
<children>
<Label fx:id="labelDni" text="DNI:"/>
<TextField fx:id="fieldDni"/>
<Label fx:id="labelTelMovil" text="Teléfono Móvil:"/>
<TextField fx:id="fieldTelMovil"/>
</children>
</HBox>
<HBox fx:id="hBoxFijoDireccion">
<children>
<Label fx:id="labelTelFijo" text="Teléfono Fijo: (opcional)"/>
<TextField fx:id="fieldTelFijo"/>
<Label fx:id="labelDireccion" text="Dirección:"/>
<TextField fx:id="fieldDireccion"/>
</children>
</HBox>
<HBox fx:id="hBoxCorreo">
<children>
<Label fx:id="labelCorreo" text="Correo:"/>
<TextField fx:id="fieldCorreo"/>
</children>
</HBox>
<HBox fx:id="hBoxBotonesCliente">
<children>
<Button fx:id="buttonCancelarEditarCliente" text="CANCELAR"/>
<Button fx:id="buttonAceptarEditarCliente" text="CONFIRMAR"/>
</children>
</HBox>
</children>
</VBox>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>
</top>
</BorderPane>
</Scene>
这是新标签的fxml文件:
mascotaTab.fxml
<AnchorPane fx:id="paneEditarMascota" xmlns:fx="http://javafx.com/fxml">
<VBox fx:id="vBoxBloqueEditarMascota">
<children>
<HBox fx:id="hBoxMascotaTamano">
<children>
<ComboBox fx:id="comboMascota">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Perro" />
<String fx:value="Gato" />
</FXCollections>
</items>
<value>
<String fx:value="Seleccionar mascota" />
</value>
</ComboBox>
<ComboBox fx:id="comboTamano">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Pequeño" />
<String fx:value="Mediano" />
<String fx:value="Grande" />
</FXCollections>
</items>
<value>
<String fx:value="Seleccionar tamaño" />
</value>
</ComboBox>
</children>
</HBox>
<HBox fx:id="hBoxNombreAlergia">
<fx:define>
<ToggleGroup fx:id="groupAlergia"/>
</fx:define>
<children>
<Label fx:id="labelNombreMascota" text="Nombre:"/>
<TextField fx:id="fieldNombreMascota"/>
<Label fx:id="labelAlergico" text="Alergico:"/>
<RadioButton fx:id="radioAlergiaSi" text="Si" toggleGroup="$groupAlergia"/>
<RadioButton fx:id="radioAlergiaNo" text="No" toggleGroup="$groupAlergia"/>
</children>
</HBox>
<HBox fx:id="hBoxRaza">
<children>
<Label fx:id="labelRaza" text="Raza:"/>
<TextField fx:id="fieldRaza"/>
<Label fx:id="labelPeso" text="Peso:"/>
<TextField fx:id="fieldPeso"/>
</children>
</HBox>
<HBox fx:id="hBoxSexoAgresividad">
<children>
<ComboBox fx:id="comboSexo">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Macho" />
<String fx:value="Hembra" />
</FXCollections>
</items>
<value>
<String fx:value="Seleccionar sexo" />
</value>
</ComboBox>
<ComboBox fx:id="comboAgresividad">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Tranquilo" />
<String fx:value="Nervioso" />
<String fx:value="Agresivo" />
</FXCollections>
</items>
<value>
<String fx:value="Seleccionar agresividad" />
</value>
</ComboBox>
</children>
</HBox>
<HBox fx:id="hBoxObservaciones">
<TextArea fx:id="areaObservaciones"/>
</HBox>
<HBox fx:id="hBoxBotonesAnadirMascota">
<Button fx:id="buttonVolverAnadirMascota"/>
<Button fx:id="buttonHomeAnadirMascota"/>
<Button fx:id="buttonAnadirMascota"/>
</HBox>
</children>
</VBox>
</AnchorPane>
编辑:NullPointer异常位于“rellenarMascota”方法中。我在第二个fxml文件中包含的任何控件都会抛出NullPointerException,但是我在第一个fxml文件中包含的任何控件都不会抛出该异常。例如,NPE以“fieldNombreMascota.setText(mascota.getNombre());
投入”rellenarMascota“方法。