2014-02-14 4 views
1

Я разработал простой пользовательский TableCell, чтобы включить издание значений в таблице. Поведение компонента показывает BigDecimalTextField независимо от того, редактируется ли пользователь или нет, эта ячейка должна постоянно включать выпуск. Компонент работает отлично, есть только странная проблема: когда таблица оказывается, вместо того, чтобы показать только одну линию, три линии показаны:JavaFX 8 Custom TableCell реализует рендеринг три раза

Rendering three times

код компонента заключается в следующем:

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

    . 
    . 
    . 

} 

Я проверил, включая с помощью отладки, если есть более чем один боб в списке используемых в таблице. Каждый раз там был только один.

+0

Похоже, что в вашей таблице есть две дополнительные записи для «vencimento», которые являются «null» или «». Можете ли вы показать нам, как ваша таблица получает данные для этого столбца? (например, что «CellValueFactory» используется для этого столбца) – denhackl

ответ

1

Я смотрел на другую таблицу в той же системе и заметил это: когда в таблице нет элемента, ни одна строка не отображается. empty table

но когда вы добавляете только одну строку, таблица отображает пустую строку, пока не достигнет высоты стола (починки светло-серые строки):

table with a row

Таким образом, было очевидно, что дополнительные строки были добавлены TableView, таким образом, простая проверка нулевой точки решает проблему:

public class BigDecimalEditingCell extends TableCell { 

    private BigDecimalField element = new BigDecimalField(new BigDecimal("0.00")); 
    private ObjectProperty<BigDecimal> campoLigado = null; 

    @Override 
    protected void updateItem(Object item, boolean empty) { 
     super.updateItem(item,empty); 
     if (getIndex() < getTableView().getItems().size() && !empty) { 
      createField(); 
      createBind(); 
      setGraphic(element); 
      setText(null); 
     } else { 
      removeBind(); 
      setGraphic(null); 
     } 
    } 

    . 
    . 
    . 
} 
+0

вы, вероятно, хотите проверить на пустое (vs. item == null). Также нет, что плохой стиль программирования расширяет сферу применения без причины: updateItem предназначен для использования исключительно подклассами, поэтому сделать его общедоступным не так – kleopatra

+0

@ kleopatra - спасибо за совет – brevleq

+0

мое удовольствие :-) Просто увидишь это сейчас : вы называете супер с пустым == false, опечаткой или намерением? – kleopatra

Смежные вопросы