TableView和ListView的删除方式如何工作?

正如我所看到的,我们必须重写equalshashCode方法,以从java Collection的java.util.List或类似的其他方法中删除Custom类的对象。

但我想知道TableViewListViewremove是如何工作的? 最近我成功地从TableViewObservableList删除了一个自定义类(Person)的对象(在查看ObservableListremove方法之后,我意识到它inheritance了java.util.Listremove(Object)方法)

然后如何通过调用删除TableView的行。 table.getItems().remove(row.getItem()) row包含Person类的对象数据,Person类没有覆盖equals(object);hashCode(); 方法

这是关于这种混乱的完整代码。

 public class RowMenu implements Callback<TableView, TableRow> { @Override public TableRow call(TableView table){ final TableRow row = new TableRow(); final ContextMenu contextMenu = new ContextMenu(); final MenuItem removeMenuItem = new MenuItem("Remove"); removeMenuItem.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { System.out.println(row.getItem()); System.out.println(table.getItems().remove(row.getItem())); } }); contextMenu.getItems().addAll(removeMenuItem); row.setContextMenu(contextMenu); row.contextMenuProperty().bind( Bindings.when(row.emptyProperty()) .then((ContextMenu)null) .otherwise(contextMenu) ); return row; } } 

默认比较仅使用对象标识; 即如果你不重写equals(...)那么object.equals(anotherObject)相当于object == anotherObject

在这种情况下,如果引用object与列表所持有的引用相同,则list.remove(object)将从list删除row

在这种情况下:

 table.getItems().remove(row.getItem()) 

显然会有效。 row.getItem()返回表行显示的项,该表与表视图的数据备份列表中保存的对象完全相同。 (表视图机制将表视图的支持列表中的引用传递给表行的updateItem(...)方法。)

如果要提供一个与要remove(...)的对象equal remove(...)参数,则只需要担心覆盖equals,但可能不是对内存中实际相同对象的引用。