2016-04-15 12 views
0

私は問題を調査するのに数時間を費やしてしまいました。私はすでにthis linkthat linkを見つけましたが、そこの提案に従ったと思っても、私のTreeTableViewは更新されません。 refreshTreeTableViewsでjavafx TreeTableViewが更新されない

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

()私はTreeTableViewには、いくつかの項目を追加してい:

は私が細胞およびcellValueファクトリーを設定するには、初期化、メソッドを使用しているコントローラを持っています。 TreeItemPropertyValueFactoriesの場合、これはうまくいきます.TreeTableViewが表示されると、すべてが正しくレンダリングされます。しかし、ShowFinancialBookingsCell()があるセルは、最初にレンダリングされません。もう一度スクロールすると、TreeTableViewの表示されていない部分が正しく表示され、ShowFinancialBookingsCell()が正しく表示されます。

これにより、refreshTreeTableViews() - Functionの後にTreeTableViewをリフレッシュしようとしましたが、これは何も変更しませんでした。

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.getChildren()。clear();の代わりに' this.setGraphic(hbox);を使用します。 this.getChildren()。add(hbox); '。違いがありますか? –

+0

こんにちはJames_D、絶対に、それを修正!このような違いがあるとは信じられませんが、ありがとうございます! – Christian

答えて

1

、あなたはグラフィックを設定する必要があります。

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

セルはおそらく、独自のレイアウトを管理し、それがテキストを表示するために、レイアウトを実行したときに、おそらくその子ノードのリストを作成しますグラフィック。

関連する問題