Javafx 在单元格上添加按钮

Javafx 在单元格上添加按钮,javafx,javafx-8,Javafx,Javafx 8,我有一个表格视图,在那里我显示来自Alumno的数据(姓名、姓氏…)。我有不同的专栏,在那里我展示了校友的每个领域,所有的作品都很好。此外,我想添加一个新的列,并在单元格内放置一个按钮,用户单击按钮,将出现一个窗口,显示有关所选项目(也称为所选人员)的信息 我尝试了这个方法,但我不知道有什么问题,因为按钮出现了,但项目总是返回空值: 班级校友 class Alumno { private String nombre; private String apellidos; getter

我有一个表格视图,在那里我显示来自Alumno的数据(姓名、姓氏…)。我有不同的专栏,在那里我展示了校友的每个领域,所有的作品都很好。此外,我想添加一个新的列,并在单元格内放置一个按钮,用户单击按钮,将出现一个窗口,显示有关所选项目(也称为所选人员)的信息

我尝试了这个方法,但我不知道有什么问题,因为按钮出现了,但项目总是返回空值:

班级校友

class Alumno
{
  private String nombre;
  private String apellidos;

  getters & setters
}
类,其中我将数据显示到表中

public class AlumnosPresenter implements Initializable {
  @FXML
  TableColumn tbcNombre, tbcApellidos, tbcFecha, tbcAsistencia;
  @FXML
  TableView tbvAlumnos;

  private FilteredList<Alumno> datosFiltrados;
  private SortedList<Alumno> listaOrdenada;

  @Override
  public void initialize(URL url, ResourceBundle rb) {
    //Link columns with properties
    tbcNombre.setCellValueFactory(new PropertyValueFactory<>("nombre"));
    tbcApellidos.setCellValueFactory(new PropertyValueFactory<>("apellidos"));

    //Assign data to table
    datosFiltrados = new FilteredList<>(datamodel.getAlumnos());

    //This is to make table searchable
    listaOrdenada = new SortedList<>(datosFiltrados);
    listaOrdenada.comparatorProperty().bind(tbvAlumnos.comparatorProperty());
    tbvAlumnos.setItems(listaOrdenada);

    //This show button but item always is null
    tbcAsistencia.setCellFactory(new Callback<TableColumn<Alumno, Alumno>, TableCell<Alumno, Alumno>>() {
        @Override
        public TableCell<Alumno, Alumno> call(TableColumn<Alumno, Alumno> colAsistencia) {
            return new TableCell<Alumno, Alumno>() {
                @Override
                protected void updateItem(Alumno item, boolean empty) {
                    super.updateItem(item, empty);

                    if (empty) {
                        setGraphic(null);
                    } else {
                        final Button btnAsistencia = new Button("Asistencia");
                        btnAsistencia.setOnAction((ActionEvent event) -> {
                            try {
                                //Where I clic on button, asistencia is not save because item is null
                                asistenciadao.guardar1(new Asistencia(new AsistenciaId(item, new Date())));
                            }
                            catch (ConstraintViolationException e) {
                                LOG.severe(e.toString());
                                new Dialogos().mostrarAdvertencia(null, "No se puede registrar más de una asistencia por día y alumno.", "");
                            }
                            catch (Exception e) {
                                LOG.severe(e.toString());
                                new Dialogos().mostrarExcepcion(null, e);
                            }

                        });
                        setGraphic(btnAsistencia);
                        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                    }
                }
            };
        }
    });
  }
}
公共类AlumnoPresenter实现可初始化{
@FXML
表列tbcNombre、tbcApellidos、tbcFecha、tbcAsistencia;
@FXML
TableView-tbvAlumnos;
私人过滤器列表datosFiltrados;
私人分类列表listaOrdenada;
@凌驾
公共void初始化(URL、ResourceBundle rb){
//使用属性链接列
tbcNombre.setCellValueFactory(新属性值工厂(“nombre”);
tbcApellidos.setCellValueFactory(新属性值工厂(“apellidos”);
//将数据分配给表
datosFiltrados=newFilteredList(datamodel.getAlumnos());
//这是为了使表格可搜索
listaOrdenada=新分类列表(datosFiltrados);
listaOrdenda.comparatorProperty().bind(tbvAlumnos.comparatorProperty());
tbvAlumnos.setItems(listaOrdenada);
//此显示按钮,但项始终为空
setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn colAsistencia){
返回新的TableCell(){
@凌驾
受保护的void updateItem(Alumno项,布尔值为空){
super.updateItem(项,空);
if(空){
设置图形(空);
}否则{
最终按钮btnAsistencia=新按钮(“Asistencia”);
btnAsistencia.setOnAction((ActionEvent事件)->{
试一试{
//在I clic on按钮中,asistencia不保存,因为该项为空
asistenciadao.guardar1(新Asistencia(新AsistenciaId(item,new Date()));
}
捕获(ConstraintViolationException e){
对数严重(如toString());
new Dialogos().mostrarAdvertencia(空,“无注册人más de una asistencia por día y alumno.”,“”);
}
捕获(例外e){
对数严重(如toString());
新Dialogos().mostrarExcepcion(null,e);
}
});
setGraphic(btnAsistencia);
setContentDisplay(仅限ContentDisplay.GRAPHIC_);
}
}
};
}
});
}
}

您需要在表列上设置一个
cellValueFactory

tbcAsistencia.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<Alumno>(cellData.getValue()));
tbcAsistencia.setCellValueFactory(cellData->new ReadOnlyObjectWrapper(cellData.getValue());

类似于@James\u D答案:

            tbcAsistencia.setCellValueFactory(new Callback<CellDataFeatures<Alumno, Alumno>, ObservableValue<Alumno>>() {
                @Override
                public ObservableValue<Alumno> call(CellDataFeatures<Alumno, Alumno> features) {
                    return new ReadOnlyObjectWrapper(features.getValue());
                }
            });
tbcAsistencia.setCellValueFactory(新回调(){
@凌驾
公共可观察值呼叫(CellDataFeatures){
返回新的ReadOnlyObjectWrapper(features.getValue());
}
});

Ref此堆栈溢出解决方案,谢谢@James\u D,但我使用您的答案而不使用lambda expresion,因为调用
.getValue()
时出现错误,所以我使用我发布的类似解决方案进行了修复。