0

私はComboxBoxTableCell成功せずに使用しようとします。
セルの内容は、オブジェクトの属性の正しい値を表示します。ただし、コンボボックスが表示されると、すべての項目がtoString属性ではなくオブジェクト メソッドで表示されます。
をオーバーライドまたは提供しようとしましたupdateItemが、何も機能しません。 ComboBoxTableCellStringConverter

テーブルセルにコンボボックスリストをカスタム表示するアイデアはありますか?

問題をすばやく確認するために、以下に短い例を示します。アプリを実行してセルをクリックするとtoString、オブジェクトの値を含むコンボボックスが表示されます。

package javafx2;  

import javafx.application.Application;
import javafx.beans.property.adapter.JavaBeanObjectPropertyBuilder;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.StringConverter;

public class ComboBoxTableCellTest extends Application {

    public class Product {
        private String name;
        public Product(String name) {
            this.name = name;
        }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }

    public class Command {
        private Integer quantite;
        private Product product;
        public Command(Product product, Integer quantite) {
            this.product = product;
            this.quantite = quantite;
        }
        public Integer getQuantite() { return quantite; }
        public void setQuantite(Integer quantite) { this.quantite = quantite; }
        public Product getProduct() { return product; }
        public void setProduct(Product product) { this.product = product; }
    }

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Product p1 = new Product("Product 1");
        Product p2 = new Product("Product 2");
        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);

        TableColumn<Command, Product> tc = new TableColumn<Command, Product>("Product");
        tc.setMinWidth(140);
        tc.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Command,Product>, ObservableValue<Product>>() {

            @Override
            public ObservableValue<Product> call(CellDataFeatures<Command, Product> cdf) {
                try {
                    JavaBeanObjectPropertyBuilder<Product> jbdpb = JavaBeanObjectPropertyBuilder.create();
                    jbdpb.bean(cdf.getValue());
                    jbdpb.name("product");
                    return (ObservableValue) jbdpb.build();
                } catch (NoSuchMethodException e) {
                    System.err.println(e.getMessage());
                }
                return null;
            }
        });
        final StringConverter<Product> converter = new StringConverter<ComboBoxTableCellTest.Product>() {

            @Override
            public String toString(Product p) {
                return p.getName();
            }

            @Override
        public Product fromString(String s) {
                // TODO Auto-generated method stub
                return null;
            }
        };

        tc.setCellFactory(new Callback<TableColumn<Command,Product>, TableCell<Command,Product>>() {

            @Override
            public TableCell<Command, Product> call(TableColumn<Command, Product> tc) {
                return new ComboBoxTableCell<Command, Product>(converter, products) {
                    @Override
                    public void updateItem(Product product, boolean empty) {
                        super.updateItem(product, empty);
                        if (product != null) {
                            setText(product.getName());
                        }
                    }
                };
            }
        });

        tv.getColumns().add(tc);
        tv.setEditable(true);

        Scene scene = new Scene(tv, 140, 200);
        stage.setScene(scene);
        stage.show();
    }
}
4

1 に答える 1

4

Desculpe-me Philippe Jean は、ポルトガル語に対応し、ドミノのことをよく知っています。

Encontrei o mesmo problema que o seu e solucionei-o com a seguinte implementationaçã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;
    }
});
于 2012-12-19T13:45:13.450 に答える