2017-04-19 36 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查看自己实现单元格的示例更新。这种单元实现有点基础,并不像标准单元那样进入和退出编辑状态,但它应该工作(未测试)。 –

相关问题