我尝试使用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);
}
其中wordListView
是ListView
而wordListItems
是ObservableList
,其中包含wordListView
的数据。
这确实有效,除了列表为空(非空)时,我无法解释原因,所以我检查了Java源代码以寻求帮助。
以上是我到目前为止发现的内容:edit(int)
上的ListView
调用更改了ListView
的内部editIndex
值,该值应该调用EDIT_START
Event
。 editIndex
是一个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还没有被调用?
答案 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);
}