2016-04-15 2 views
0

Я провел несколько часов, исследуя проблему, и просто не могу опустить голову. Я уже нашел this link и that link, но, хотя я думаю, что следил за предложениями, мой TreeTableView не обновляется.javafx TreeTableView не получается Обновлено

У меня есть контроллер, в котором я использую метод инициализации-установить сотовые и CellValue-заводы:

aktivaValueTreeTableColumn.setCellValueFactory(new TreeItemPropertyValueFactory<>("valueAsString")); 
    aktivaValueTreeTableColumn.setCellFactory(Helper.getPaddingCallbackFactory()); 
    aktivaValueTreeTableColumn.setStyle(StyleHelper.alignTextRight()); 
    aktivaActionColumn.setStyle(StyleHelper.alignTextRight()); 


    aktivaActionColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<BalanceSheetItem, String>, ObservableValue<String>>() { 
     @Override 
     public ObservableValue<String> call(TreeTableColumn.CellDataFeatures<BalanceSheetItem, String> param) { 
      if (param == null || param.getValue() == null || param.getValue().getValue() == null || param.getValue().getValue().getAccount() == null) { 
       return new SimpleStringProperty(StringUtils.EMPTY); 
      } 
      return param.getValue().getValue().getAccount().getAccountNumberSimpleString(); 
     } 

    }); 

    // create a cell value factory with an add button for each row in the table. 
    aktivaActionColumn.setCellFactory(
      new Callback<TreeTableColumn<BalanceSheetItem, String>, TreeTableCell<BalanceSheetItem, String>>() { 
     @Override 
     public TreeTableCell<BalanceSheetItem, String> call(
       TreeTableColumn<BalanceSheetItem, String> param) { 
      return new ShowFinancialBookingsCell(); 
     } 
    }); 

    refreshTreeTableViews(); 

В refreshTreeTableViews() я добавляю несколько элементов в виде табличного дерево. Для TreeItemPropertyValueFactories это работает отлично, все получается корректно отображаться, когда появляется TreeTableView. Тем не менее, ячейки, в которых отображается ShowFinancialBookingsCell(), сначала не отображаются. Когда я снова прокручиваюсь вниз, часть TreeTableView, которая была скрыта и снова появилась на экране, показывает ShowFinancialBookingsCell().

В связи с этим я попытался обновить TreeTableView после функции refreshTreeTableViews() - Function, но это ничего не изменило.

код из ShowFinancialBookingsCell является:

public class ShowFinancialBookingsCell extends TreeTableCell<BalanceSheetItem, String> { 

@Override 
protected void updateItem(String accountNo, boolean empty) { 
    super.updateItem(accountNo, empty); //To change body of generated methods, choose Tools | Templates. 

    if (isEmpty()) { 
     setGraphic(null); 
     setText(null); 
    } else if (accountNo != null && StringUtils.isNotBlank(accountNo)) { 
     refreshView(accountNo); 
    } else { 
     // If this is the root we just display the text. 
     setGraphic(null); 
     setText(null); 
    } 
} 

private void refreshView(String account) { 
    Button button = new Button(); 
    HBox hbox = new HBox(); 
    button.setPrefWidth(40); 
    hbox.setPadding(new Insets(0, 0, 0, 10)); 
    button.setGraphic(new ImageView(ImageProvider.getImageForName(ImageProvider.OPEN_SYMBOL))); 
    button.setOnAction(new EventHandler<javafx.event.ActionEvent>() { 
     @Override 
     public void handle(javafx.event.ActionEvent event) { 
      List<Account> a = AccountManagerImpl.getInstance().findByAccountNumber(account); 
      if (CollectionUtils.isNotEmpty(a)) { 
       try { 
        WindowHelper.showObjectListDisplay(new ArrayList<>(FinanceManagerImpl.getInstance().findAllForAccount(a.get(0)))); 
       } catch (IOException ex) { 
        Logger.getLogger(ShowFinancialBookingsCell.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
    }); 
    hbox.getChildren().add(button); 
    this.getChildren().clear(); 
    this.getChildren().add(hbox); 
} 

}

ли кто-нибудь есть идея, что я делаю не так в моих пользовательских ячеек? Другие ячейки (имеющие TreeItemPropertyValueFactory) выглядят красиво.

+1

Обычно вы должны использовать 'this.setGraphic (hbox);' вместо 'this.getChildren(). Clear(); . This.getChildren() добавить (горизонтальный бокс); '. Это имеет значение? –

+0

Hi James_D, абсолютно, это исправлено! Не могу поверить, что это имеет такое значение, но спасибо вам большое! – Christian

ответ

1

Вместо добавления детей в ячейку, вы должны установить графики:

hbox.getChildren().add(button); 
// this.getChildren().clear(); 
// this.getChildren().add(hbox); 
this.setGraphic(hbox); 

Клетка, вероятно, управляет своей собственной компоновкой и, вероятно, строит свой список дочернего узла, когда он выполняет компоновку, чтобы отобразить текст и графики.

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