即使没有基础数据,表中的额外元素也始终可见

时间:2013-07-24 14:31:40

标签: javafx-2 javafx

这是我的问题。我的表有普通文本列,2列有下拉列表,有一列有复选框。这是我对下拉列的单元工厂的回调:

     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扩展了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);
    }
}

我的问题是,当Table非常大并且其中只有2行时,无论如何都会产生下拉列表,它看起来像这样:

enter image description here

有没有一种方法可以生成尽可能多的下拉列表和复选框,因为可以在此表中提供的可观察列表中有多少项?

1 个答案:

答案 0 :(得分: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);
        }
    }