2017-04-19 41 views
0

將bean適配器對象綁定到TableView時遇到問題,該對象使用該適配器屬性創建組合框。JavaFX TableView爲每一行分開的bean適配器。怎麼樣?

lanSpecie.setCellFactory(new Callback<TableColumn<HAUL,Specie>, TableCell<HAUL,Specie>>() { 
    @Override 
    public TableCell<HAUL, Specie> call(TableColumn<HAUL, Specie> param) { 
     TableCell<HAUL, Specie> cell = new TableCell<>(); 
     ComboBox<Specie> comboBox = new ComboBox<>(FXCollections.observableList(specieService.findAllAdded())); 
      try { 
       comboBox.valueProperty().bindBidirectional(new JavaBeanObjectPropertyBuilder<Object>().bean(haulBean).name("specie").build()); 
      } catch (NoSuchMethodException e) { 
       e.printStackTrace(); 
      } 
      cell.graphicProperty().bind(Bindings.when(cell.emptyProperty()).then((Node) null).otherwise(comboBox)); 
      return cell; 
     } 
    }); 

我的3行表中加入:

Haul table

每當改變一個元件,它自動地改變所有3.

尋找溶液或引導在正確的方向,所以該表查找每個行元素作爲新的HAUL對象,從而爲每行創建新的適配器實例。

+0

什麼是該代碼中的「haulBean」?它看起來像是將所有組合框的值綁定到一個屬性。你不能在這裏使用標準的['ComboBoxTableCell'](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/cell/ComboBoxTableCell.html)嗎? –

+0

haulBean是我的實體對象(在這種情況下爲POJO)。 您可以將javabean適配器字段綁定到ComboBoxTableCell嗎? – Kefirchiks

+0

但是哪個實體對象?每行有一個。這沒有什麼意義。您應該使用單元格*值*工廠映射到Java Bean適配器,然後使用單元工廠指定表格單元格。我沒有看到任何不適用於ComboBoxTableCell的原因。 –

回答

2

當單元格需要顯示一個新值時(例如單元格初始化時,如果屬性更改,單元格被重新用於新值等,單元格的單個值將傳遞到單元格的updateItem(...)方法中)。

lanSpecie.setCellFactory(ComboBoxTableCell.forTableColumn(
    FXCollections.observableList(specieService.findAllAdded())); 

lanSpecie.setCellValueFactory(cellData -> 
    new JavaBeanObjectPropertyBuilder<Specie>() 
     .bean(cellData.getValue()) 
     .name("specie") 
     .build()); 

已經這樣做了,你可以使用標準ComboBoxTableCell得到你所需要的細胞功能:您可以使用cellValueFactory控制傳遞到細胞ComboBoxTableCell正在做的事情就像你會得到以下內容:

lanSpecie.setCellFactory(column -> new TableCell<HAUL, Specie>() { 
    private final ComboBox<Specie> comboBox = new ComboBox<>(); 

    { 
     comboBox.setItems(FXCollections.observableList(specieService.findAllAdded())); 
     comboBox.setOnAction(e -> commitEdit(comboBox.getValue())); 
    } 

    @Override 
    protected void updateItem(Specie specie, boolean empty) { 
     super.updateItem(specie, empty); 
     if (empty) { 
      setGraphic(null); 
     } else { 
      comboBox.setValue(specie); 
      setGraphic(comboBox); 
     } 
    } 
}); 

lanSpecie.setOnEditCommit(event -> { 
    HAUL haul = event.getRowValue(); 
    haul.setSpecie(event.getNewValue()); 
}); 
+0

非常感謝! 有沒有辦法,我可以使用'ComboBox'而不是'ComboBoxTableCell'並將其value屬性綁定到我的JavabeanObjectProperty? – Kefirchiks

+0

@Kefirchiks那麼,組合框表格單元對你來說確實如此,但如果你真的想要,你可以自己實現它。我不認爲你可以使用綁定本身,因爲單元格值工廠在每次調用時都必須創建一個新的屬性實例,所以您需要改爲偵聽器。 –

+0

@Kefirchiks查看自己實現單元格的示例更新。這種單元實現有點基礎,並不像標準單元那樣進入和退出編輯狀態,但它應該工作(未測試)。 –

相關問題