0

これが私の問題です。通常のテキスト列を持つテーブルと、ドロップダウンを持つ2つの列とチェックボックスを持つ1つの列があります。これは、ドロップダウン列のセル ファクトリのコールバックです。

     Callback<TableColumn<Person, String>, TableCell<Person, String>> dropdownConditionCellFactory =
                   new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
               @Override
               public TableCell call(TableColumn p) {
                 Tools.Tables.ComboBoxCell<partCondition> cell = new  Tools.Tables.ComboBoxCell<partCondition>(partConditionList)

                   return cell;
               }
           };

このセル ファクトリのクラス:

public static class ComboBoxCell extends TableCell {

    private ComboBox combo;

    public ComboBoxCell() {
        combo = new ComboBox();
        setGraphic(combo);
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);

    }

    public ComboBoxCell(ObservableList items) {
        combo = new ComboBox();
        combo.setItems(items);
        setGraphic(combo);
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        combo.getSelectionModel().selectFirst();
    }

    public T getSelectedItem()
    {
        return (T) combo.getSelectionModel().getSelectedItem();
    }

    public void setSelectedItem(T t)
    {
        combo.getSelectionModel().select(t);
    }
}

私の問題は、テーブルが非常に大きく、その中に2行しかない場合、とにかくドロップダウンが生成され、次のようになることです:

ここに画像の説明を入力

このテーブルにフィードする観察可能なリストにあるアイテムと同じ数のドロップダウンとチェックボックスのみを生成する方法はありますか?

4

1 に答える 1

1

セルを操作する際は、事前にCell APIを読んで、内部でセルがどのように処理されるかを理解してください。つまり、セルはさまざまな行で再利用され、さまざまなアイテム/レコードがレンダリングされます。セルが再利用されるたびに、そのupdateItem()メソッドが呼び出され、セルがレンダリングしているアイテムが更新されます。graphicしたがって、コンストラクターではなく、このメソッドをオーバーライドして、そこで制御する必要があります。

    private ComboBox combo;

    public ComboBoxCell() {
        combo = new ComboBox();
    }

    public ComboBoxCell(ObservableList items) {
        combo = new ComboBox();
        combo.setItems(items);
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            combo.getSelectionModel().select(item);
            setGraphic(combo);
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        }
    }
于 2013-07-24T15:28:39.127 に答える