我尝试使用ComboxBoxTableCell
但没有成功
单元格的内容显示对象属性的正确值。但是当显示组合框时,所有项目都使用toString
对象方法而不是属性显示
我试图覆盖updateItem
的{{1}}或提供ComboBoxTableCell
,但无效。
您对表格单元格中的自定义comboxbox列表显示有什么想法吗?
我在下面举了一个简短的例子来快速查看问题。执行应用程序并单击单元格,您将看到具有StringConverter
对象值的组合框。
toString
答案 0 :(得分:4)
Desculpe-me Philippe Jeanporresponseê-loemportuguês,mas comonãodominobemsualíngua,achei melhor desta forma。
Encontrei o mesmo problema que o seu e solucionei-o com a seguinteimplementação。
我发现了与您相同的问题,并通过以下实施解决了这个问题。
final ObservableList<Product> products = FXCollections.observableArrayList(p1, p2);
ObservableList<Command> commands = FXCollections.observableArrayList(new Command(p1, 20));
TableView<Command> tv = new TableView<Command>();
tv.setItems(commands);
/**
* Substitua as sugestões de tipo Product por String da TableColumn e suas correlacionadas como abaixo
*/
TableColumn<Command, String> tc = new TableColumn<Command, String>("Product");
tc.setMinWidth(140);
tc.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Command, String>, ObservableValue<String>>(){
@Override
public ObservableValue<String> call(CellDataFeatures<Command, String> p) {
return new SimpleObjectProperty(p.getValue().getProduct().getName());
}
});
tc.setCellFactory(new Callback<TableColumn<Command, String>, TableCell<Command, String>>() {
@Override
public TableCell<Command, String> call(TableColumn<Command, String> p) {
/**
* Este Map guardará os objetos Product indexando pelo "name"
*/
final Map<String, Product> products = new HashMap();
Iterator<Product> productsi = pojosComboBox.iterator();
while(productsi.hasNext()) {
Product product = productsi.next();
products.put(product.getName(), product);
}
ComboBoxTableCell cell = new ComboBoxTableCell(FXCollections.observableArrayList(products.keySet())){
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if(item != null) {
/**
* Aqui acontece a atualização do objeto Command de acordo com o esperado
*/
tabela.getItems().get(getIndex()).setProduct(products.get(item.toString()));
}
}
};
cell.setAlignment(Pos.CENTER);
return cell;
}
});