TableView仅显示一列中的数据,无法显示不同的数据模型

时间:2015-08-17 22:13:18

标签: javafx javafx-2 tableview tablecolumn

当tableview必须显示一个类中的数据(例如Servicios)时,它就可以正常完成。当我必须从一个类访问另一个类时,问题出现了。在这种情况下,TableView显示来自第一个类的数据,但不显示来自第二个类的数据。我不知道为什么。这是我的代码。

package mrpuppy.entity;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="tarifa")
public class Tarifa 
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @OneToMany(mappedBy = "tarifa")
    private List<Servicio> servicios = new ArrayList<Servicio>();
    @Column(name="precio")
    private float precio;
    @Column(name="descuento")
    private float descuento;
    @Column(name="fecha_inicio")
    private Date fechaInicio;
    @Column(name="fecha_fin")
    private Date fechaFin;

    public Long getId() 
    {
        return id;
    }

    public List<Servicio> getServicios() 
    {
        return servicios;
    }

    public void setServicios(List<Servicio> servicios) 
    {
         this.servicios = servicios;
    }

    public float getPrecio()
    {
         return precio;
    }

public void setPrecio(float precio)
{
    this.precio = precio;
}

public float getDescuento() 
{
    return descuento;
}

public void setDescuento(float descuento)
{
    this.descuento = descuento;
}

public Date getFechaInicio()
{
    return fechaInicio;
}

public void setFechaInicio(Date fechaInicio) 
{
    this.fechaInicio = fechaInicio;
}

public Date getFechaFin()
{
    return fechaFin;
}

public void setFechaFin(Date fechaFin)
{
    this.fechaFin = fechaFin;
}
}
package mrpuppy.entity;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="servicio")
public class Servicio
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne(cascade = {CascadeType.ALL})
@JoinColumn(name="id_tarifa")
private Tarifa tarifa;
@Column(name="nombre")
private String nombre;
@Column(name="raza")
private String raza;
@OneToOne(mappedBy="servicio", cascade = {CascadeType.ALL})
private CitaServicio citaServicio;

public Long getId() 
{
    return id;
}

public void setId(Long id) 
{
    this.id = id;
}

public Tarifa getTarifa() 
{
    return tarifa;
}

public void setTarifa(Tarifa tarifa)
{
    this.tarifa = tarifa;
}

public String getNombre() 
{
    return nombre;
}

public void setNombre(String nombre) 
{
    this.nombre = nombre;
}

public String getRaza() 
{
    return raza;
}

public void setRaza(String raza) 
{
    this.raza = raza;
}

public CitaServicio getCitaServicio() 
{
    return citaServicio;
}

public void setCitaServicio(CitaServicio citaServicio)
{
    this.citaServicio = citaServicio;
}
}
package mrpuppy.controller.tarifas;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;

import mrpuppy.entity.Servicio;
import mrpuppy.entity.Tarifa;
import mrpuppy.service.TarifaService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

@Controller
public class TarifasControllerImpl implements TarifasController
{

private Stage primaryStage;
private Scene scene;

private final String css = this.getClass().getResource("/css/tarifas.css").toExternalForm();

@Autowired
private AnadirTarifaController anadirTarifaController;
@Autowired
private TarifaService tarifaService;

@FXML
private TableView<Servicio> tablaServicios;
@FXML
private TableColumn<Servicio, String> columnServicio;
@FXML
private TableColumn<Tarifa, Float> columnTarifa;
@FXML
private TableColumn<Tarifa, Float> columnDescuento;
@FXML
private ComboBox<String> comboRaza;
@FXML
private Button buttonAnadir;
@FXML
private Button buttonMostrar;

@Override
public void openWindow() 
{
    try
    {
        primaryStage = new Stage();
        primaryStage.setResizable(false);
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/tarifas.fxml"));
        loader.setController(this);     //Establecemos esta clase como "controller"
        scene = loader.load();
        scene.getStylesheets().add(css);
        primaryStage.setScene(scene);
        primaryStage.show();

        ObservableList<String> oListRazas;
        oListRazas = tarifaService.obtenerRazas();
        comboRaza.setItems(oListRazas);

        buttonAnadir.setOnAction(new EventHandler<ActionEvent>()
                  {
            @Override
            public void handle(ActionEvent event)
            {
                anadirTarifaController.openWindow();
            }
      });

        buttonMostrar.setOnAction(new EventHandler<ActionEvent>()
                  {
            @Override
            public void handle(ActionEvent event)
            {
                Collection<Servicio> lista = new ArrayList<Servicio>();
                String raza = comboRaza.getValue();
                lista = tarifaService.buscarServicios(raza);
                mostrarDatos(lista);
            }
       });

    }
    catch(IOException ioe)
    {
        System.out.println(ioe.getMessage());
    }
}


private void mostrarDatos(Collection<Servicio> lista)
{
    ObservableList<Servicio> servicioData = FXCollections.observableArrayList();
    for(Servicio servicio : lista)
    {
        servicioData.add(servicio);
    }
    columnServicio.setCellValueFactory(new PropertyValueFactory<Servicio, String>("nombre"));
    columnTarifa.setCellValueFactory(new PropertyValueFactory<Tarifa, Float>("precio"));
    columnDescuento.setCellValueFactory(new PropertyValueFactory<Tarifa, Float>("descuento"));

    tablaServicios.setItems(servicioData);
}

}

1 个答案:

答案 0 :(得分:1)

通过

window.onload

你的tableview将呈现private TableView<Servicio> tablaServicios; 个对象,所以逻辑上tablecolumns应该呈现Servicio对象的一些字段/部分。例如

Servicio

等。但是,您尝试在该表中呈现private TableColumn<Servicio, String> columnNombre; private TableColumn<Servicio, String> columnRaza; 对象。这是不可能的。而不是

Tarifa

将其定义为

 private TableColumn<Tarifa, Float> columnDescuento;
 ...
 columnDescuento.setCellValueFactory(new PropertyValueFactory<Tarifa, Float>("descuento"));

为他人做同样的事。