【问题标题】:Add button on cell在单元格上添加按钮
【发布时间】:2015-02-21 03:57:04
【问题描述】:

我有一个表格视图,我在其中显示来自 Alumno(name,lastname...) 的数据。我有不同的列,我在其中显示 Alumno 的每个字段,并且一切正常。另外,我想添加一个新列并在单元格内放置一个按钮,用户单击该按钮,会出现一个窗口,显示有关所选项目(也称为所选人员)的信息。

我试试这个,但我不知道有什么问题,因为按钮出现但项目总是返回 null:

班级校友

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);
                    }
                }
            };
        }
    });
  }
}

【问题讨论】:

标签: javafx javafx-8


【解决方案1】:

您需要在表格列上设置cellValueFactory

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

【讨论】:

  • 感谢@James_D,但我使用你的答案而不使用 lambda 表达式,因为我在调用 .getValue() 时遇到错误,所以我使用我发布的类似解决方案进行修复。
【解决方案2】:

@James_D 回答的类似方法:

            tbcAsistencia.setCellValueFactory(new Callback<CellDataFeatures<Alumno, Alumno>, ObservableValue<Alumno>>() {
                @Override
                public ObservableValue<Alumno> call(CellDataFeatures<Alumno, Alumno> features) {
                    return new ReadOnlyObjectWrapper(features.getValue());
                }
            });

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 2012-09-15
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多