时间:2016-08-31 09:01:53

标签: java javafx javafx-8

我尝试使用ListView作为字符串编辑器,它来自自定义数据模型。我使用TextFieldListCell s为单元格提供了适当的StringConverter

ListView旁边有一个添加按钮,可以在操作中调用此方法:

@FXML
private void addElement() {
    WordListItem newItem = new WordListItem(-1, "");

    wordListItems.add(newItem);
    wordListView.setEditable(true);
    wordListView.getSelectionModel().select(wordListItems.indexOf(newItem));
    wordListView.edit(wordListItems.indexOf(newItem));
    wordListView.setEditable(false);
}

其中wordListViewListViewwordListItemsObservableList,其中包含wordListView的数据。

这确实有效,除了列表为空(非空)时,我无法解释原因,所以我检查了Java源代码以寻求帮助。

以上是我到目前为止发现的内容:edit(int)上的ListView调用更改了ListView的内部editIndex值,该值应该调用EDIT_START EventeditIndex是一个ReadOnlyIntegerWrapper我在其中发现了一些我无法理解的奇怪代码,而且我不确定这些代码是否真的产生了错误,或者我只是可以'看看他们为什么这样做了:

@Override
protected void fireValueChangedEvent() {
    super.fireValueChangedEvent();
    if (readOnlyProperty != null) {
        readOnlyProperty.fireValueChangedEvent();
    }
}

只要更改editIndex的{​​{1}}属性,就会调用此方法。问题:ListView为空,因为它未在任何地方设置。我能找到的唯一可以找到的地方是吸气剂:

readOnlyProperty

public ReadOnlyIntegerProperty getReadOnlyProperty() { if (readOnlyProperty == null) { readOnlyProperty = new ReadOnlyPropertyImpl(); } return readOnlyProperty; } 是一个内部私有类,ReadOnlyIntegerImpl是它的类型)

现在我的实际问题:这是一个错误还是我在监督什么?我有没有理由在列表中添加和编辑新创建的元素,就像它是空的那样,或者它真的只是这个getter还没有被调用?

1 个答案:

答案 0 :(得分:1)

您找到的源代码只是延迟初始化属性的代码。

除非为属性分配了新值或请求了属性本身,否则null可用作属性以避免不必要的属性对象创建。这不是问题。

问题似乎是在调用ListView之前未更新edit个单元格。这在布局期间发生,因此在开始编辑之前“手动”调用layout应该有效:

private void addElement() {
    WordListItem newItem = new WordListItem(-1, "");

    wordListItems.add(newItem);
    wordListView.setEditable(true);

    wordListView.layout();

    wordListView.edit(wordListItems.size()-1);
    wordListView.setEditable(false);
}