如何使用ComboBoxTableCell显示不同的值?

时间:2012-11-01 16:20:47

标签: combobox tableview javafx-2

我尝试使用ComboxBoxTableCell但没有成功 单元格的内容显示对象属性的正确值。但是当显示组合框时,所有项目都使用toString对象方法而不是属性显示 我试图覆盖updateItem的{​​{1}}或提供ComboBoxTableCell,但无效。

您对表格单元格中的自定义comboxbox列表显示有什么想法吗?

我在下面举了一个简短的例子来快速查看问题。执行应用程序并单击单元格,您将看到具有StringConverter对象值的组合框。

toString

1 个答案:

答案 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;
    }
});