Я разработал простой пользовательский TableCell, чтобы включить издание значений в таблице. Поведение компонента показывает BigDecimalTextField независимо от того, редактируется ли пользователь или нет, эта ячейка должна постоянно включать выпуск. Компонент работает отлично, есть только странная проблема: когда таблица оказывается, вместо того, чтобы показать только одну линию, три линии показаны:JavaFX 8 Custom TableCell реализует рендеринг три раза
код компонента заключается в следующем:
public class BigDecimalEditingCell extends TableCell {
private BigDecimalField spinner = new BigDecimalField(new BigDecimal("0.00"));
private ObjectProperty<BigDecimal> campoLigado = null;
public BigDecimalEditingCell() {
this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
createField();
}
private void createField() {
spinner.setStepwidth(new BigDecimal("0.01"));
spinner.setMinValue(new BigDecimal("0.00"));
spinner.setFormat(NumberFormat.getInstance());
spinner.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
}
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
criarBind();
setGraphic(spinner);
setText(null);
}
private void criarBind() {
ObservableValue<BigDecimal> valor = getTableColumn().getCellObservableValue(getIndex());
if (valor != null) {
ObjectProperty<BigDecimal> propriedade = (ObjectProperty<BigDecimal>) valor;
if (campoLigado == null) {
spinner.numberProperty().bindBidirectional(propriedade);
campoLigado = propriedade;
} else if (campoLigado != propriedade) {
spinner.numberProperty().unbindBidirectional(campoLigado);
spinner.numberProperty().bindBidirectional(propriedade);
campoLigado = propriedade;
}
}
}
}
Если я использую значение по умолчанию TextFieldTableCell, таблица отображается правильно. У меня есть еще один компонент (например, этот), который использует JavaFX's DatePicker и та же проблема. Что я делаю неправильно?
ДОБАВЛЕНО
Вот использование этого компонента:
public class ControladorPainelFormaPagamento extends ControladorPainelSubmeter {
@FXML
private TableView<ParcelaBean> tabela;
@FXML
private TableColumn<ParcelaBean, LocalDate> colunaVencimento;
@FXML
private TableColumn<ParcelaBean, BigDecimal> colunaValor;
private FormaPagamentoBean bean;
.
.
.
private void configurarColunaValor() {
colunaValor.setCellValueFactory(new PropertyValueFactory<ParcelaBean, BigDecimal>("valor"));
colunaValor.setCellFactory(new Callback<TableColumn<ParcelaBean, BigDecimal>, TableCell<ParcelaBean, BigDecimal>>() {
@Override
public TableCell<ParcelaBean, BigDecimal> call(TableColumn<ParcelaBean, BigDecimal> parcelaBeanStringTableColumn) {
return new BigDecimalEditingCell();
}
});
}
private void configurarColunaVencimento() {
colunaVencimento.setCellValueFactory(new PropertyValueFactory<ParcelaBean, LocalDate>("dataVencimento"));
}
public void carregar(ModoExibicao modoExibicao, FormaPagamentoBean formaPagamento) {
this.bean=formaPagamento;
tabela.setItems(bean.getParcelas());
.
.
.
}
.
.
.
}
Я проверил, включая с помощью отладки, если есть более чем один боб в списке используемых в таблице. Каждый раз там был только один.
Похоже, что в вашей таблице есть две дополнительные записи для «vencimento», которые являются «null» или «». Можете ли вы показать нам, как ваша таблица получает данные для этого столбца? (например, что «CellValueFactory» используется для этого столбца) – denhackl