将新节点添加到场景后使用@FXML时出现NullPointerException

时间:2015-08-20 09:02:41

标签: javafx fxml

我正在创建标签。出于这个原因,我创建了新的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:&#10;(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“方法。

0 个答案:

没有答案