Error Table JavaFx FXML

0

I'm learning a bit with the view model -controller and JavaFXML . The fact is that I want to make an application that adds data (students' notes) to a tableView , I can edit and delete them. With the following code, all the fields of the Jtxfield minus the DNI column are added, I have reviewed it again and again and I do not give with the problem. (The program has other failures right now but that is the one that brings me head first). Greetings:

package AplicacionNotas;

import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;

/**
 *
 * @author Raul
 */
public class vistaControlador implements Initializable {

    // Declaramos los botones
    @FXML private Button btnNuevaNota;
    @FXML private Button btnEditarNota;
    @FXML private Button btnEliminarNota;
    @FXML private Button btnGuardarNota;

    // Declaramos los textfileds
    @FXML private TextField txDNI;
    @FXML private TextField txAsignatura;
    @FXML private TextField txNota;
    @FXML private TextField txRecuperacion;

    // Declaramos la tabla y las columnas
    @FXML private TableView<Persona> tbAlumnos;
    @FXML private TableColumn tbcDNI;
    @FXML private TableColumn tbcAsignatura;
    @FXML private TableColumn tbcNota;
    @FXML private TableColumn tbcRecuperacion;
    ObservableList<Persona> personas;

    private int posicionPersonaEnTabla;

    /**
     * Método que realiza las acciones tras pulsar el boton "Nuevo"
     *
     * @param event
     */
    @FXML private void handleNuevaNota (ActionEvent event) {
    }

    /**
     * Método que realiza las acciones tras pulsar el boton "Añadir"
     *
     * @param event
     */
    @FXML private void handleGuardarNota(ActionEvent event) {
        Persona persona = new Persona();
        persona.dni.set(txDNI.getText());
        persona.asignatura.set(txAsignatura.getText());
        persona.nota.set(Integer.parseInt(txNota.getText()));
        persona.recuperacion.set(txRecuperacion.getText());
        personas.add(persona);
    }

    /**
     * Método que realiza las acciones tras pulsar el boton "Modificar"
     *
     * @param event
     */
    @FXML private void handleEditarNota(ActionEvent event) {
        Persona persona = new Persona();
        persona.dni.set(txDNI.getText());
        persona.asignatura.set(txAsignatura.getText());
        persona.nota.set(Integer.parseInt(txNota.getText()));
        persona.recuperacion.set(txRecuperacion.getText());
        personas.set(posicionPersonaEnTabla, persona);
    }

    /**
     * Método que realiza las acciones tras pulsar el boton "Eliminar"
     *
     * @param event
     */
    @FXML private void handleEliminarNota(ActionEvent event) {
        if(tbAlumnos==null){
        personas.remove(posicionPersonaEnTabla);
        }
        else{personas.remove(posicionPersonaEnTabla);}

    }
    /**
     * Listener de la tabla personas
     */
    private final ListChangeListener<Persona> selectortbAlumnos =
            new ListChangeListener<Persona>() {
                @Override
                public void onChanged(ListChangeListener.Change<? extends Persona> c) {
                    ponerPersonaSeleccionada();
                }
            };

    /**
     * PARA SELECCIONAR UNA CELDA DE LA TABLA "tbAlumnos"
     */
    public Persona gettbAlumnosSeleccionada() {
        if (tbAlumnos != null) {
            List<Persona> tabla = tbAlumnos.getSelectionModel().getSelectedItems();
            if (tabla.size() == 1) {
                final Persona competicionSeleccionada = tabla.get(0);
                return competicionSeleccionada;
            }
        }
        return null;
    }

    /**
     * Método para poner en los textFields la tupla que selccionemos
     */
    private void ponerPersonaSeleccionada() {
        final Persona persona = gettbAlumnosSeleccionada();
        posicionPersonaEnTabla = personas.indexOf(persona);

        if (persona != null) {

            // Pongo los textFields con los datos correspondientes
            txDNI.setText(persona.getDni());
            txAsignatura.setText(persona.getAsignatura());
            txNota.setText(persona.getNota().toString());
            txRecuperacion.setText(persona.getRecuperacion());

            // Pongo los botones en su estado correspondiente
            btnEditarNota.setDisable(false);
            btnEliminarNota.setDisable(false);
            btnNuevaNota.setDisable(true);

        }
    }

    /**
     * Método para inicializar la tabla
     */
    private void inicializartbAlumnos() {
        tbcDNI.setCellValueFactory(new PropertyValueFactory<Persona, String>("DNI Alumno"));
        tbcAsignatura.setCellValueFactory(new PropertyValueFactory<Persona, String>("Asignatura"));
        tbcNota.setCellValueFactory(new PropertyValueFactory<Persona, Integer>("Nota"));
        tbcRecuperacion.setCellValueFactory(new PropertyValueFactory<Persona, String>("Recuperacion"));

        personas = FXCollections.observableArrayList();
        tbAlumnos.setItems(personas);
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        // Inicializamos la tabla
        this.inicializartbAlumnos();

        // Ponemos estos dos botones para que no se puedan seleccionar
        btnEditarNota.setDisable(true);
        btnEliminarNota.setDisable(true);

        // Seleccionar las tuplas de la tabla de las personas
        final ObservableList<Persona> tbAlumnosel = tbAlumnos.getSelectionModel().getSelectedItems();
        tbAlumnosel.addListener(selectortbAlumnos);

    }
}

PERSONAL CLASS:

package ApplicationNotes;

import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty;

public class Person {

public SimpleStringProperty dni = new SimpleStringProperty();
public SimpleStringProperty asignatura = new SimpleStringProperty();
public SimpleIntegerProperty nota = new SimpleIntegerProperty();
public SimpleStringProperty recuperacion = new SimpleStringProperty();


public String getDni(){
    return dni.get();
}

public String getAsignatura(){
    return asignatura.get();
}

public Integer getNota (){
    return nota.get();
}

public String getRecuperacion(){
    return recuperacion.get();
}

}

    
asked by Raul.Rt 15.11.2017 в 17:31
source

1 answer

1

Try changing your "Person" class with the following code:

 public class Persona{

private StringProperty dni;
private StringProperty asignatura;
private IntegerProperty nota;
private StringProperty recuperacion;

public Persona(String dni , String asignatura , int nota , String recuperacion) {
    this.dni  = new SimpleStringProperty(dni);
    this.asignatura  = new SimpleStringProperty(asignatura);
    this.nota  = new SimpleIntegerProperty(nota);
    this.recuperacion = new SimpleStringProperty(recuperacion);
}

public Persona() {

}

public String getDni () {
    return dni .get();
}
public void setDni (String dni ) {
    this.dni  = new SimpleStringProperty(dni );
}

public String getAsignatura () {
    return asignatura .get();
}
public void setAsignatura (String asignatura ) {
    this.asignatura  = new SimpleStringProperty(asignatura );
}

public int getNota () {
    return nota.get();
}
public void setNota (int  nota ) {
    this.nota  = new SimpleIntegerProperty(nota );
}

public String getRecuperacion() {
    return recuperacion.get();
}
public void setRecuperacion(String recuperacion) {
    this.recuperacion = new SimpleStringProperty(recuperacion);
}
}

And the "initializartbAlumnos ()" method modify it as follows:

 private void inicializartbAlumnos() {
    tbcDNI.setCellValueFactory(new PropertyValueFactory<Persona, String>("dni"));
    tbcAsignatura.setCellValueFactory(new PropertyValueFactory<Persona, String>("asignatura"));
    tbcNota.setCellValueFactory(new PropertyValueFactory<Persona, Integer>("nota"));
    tbcRecuperacion.setCellValueFactory(new PropertyValueFactory<Persona, String>("recuperacion"));

    personas = FXCollections.observableArrayList();
    tbAlumnos.setItems(personas);
}

Check and comment if it worked, (I think that should work)

    
answered by 15.11.2017 / 18:13
source