从 TableView 中删除多行

Deleting multiple rows from TableView

@FXML
private void handleDeleteAction(ActionEvent event) {
    for (Transaction transaction : transactionsTable.getSelectionModel().getSelectedItems()) {
        RemoveTransactionsCommand removeTransactionsCommand = new RemoveTransactionsCommand(transaction, transactionsTable.getSelectionModel().getSelectedItems(), data);
        commandRegistry.executeCommand(removeTransactionsCommand);
    }
}

为什么在我 select 超过一行的情况下它不起作用,我的意思是它删除一行(有时两行,但找不到决定它的原因)

命令实现如下:

public class RemoveTransactionsCommand implements Command {

    private ObservableList<Transaction> selectedItems;
    private Transaction transactionToRemove;
    private Account account;

    public RemoveTransactionsCommand(Transaction transactionToRemove, ObservableList<Transaction> selectedItems, Account account) {
        this.account = account;
        this.transactionToRemove = transactionToRemove;
        this.selectedItems = selectedItems;
    }

    @Override
    public String getName() {
        int presentSize = selectedItems.size();
        return presentSize + "transaction/s removed";
    }

    @Override
    public void execute() {
        account.removeTransaction(transactionToRemove);

    }

}

和删除命令:

public void removeTransaction(Transaction transaction) {
    this.transactions.remove(transaction);
}

此外,我想知道实际删除操作的大小,但我作为第二个参数传递的不是静态的,例如,当每一行都被删除时,它将是 0。

有什么改进建议吗? 可以找到完整的项目 here

问题是当 table 中的项目列表更改时,所选项目列表可能会更改。因此,当您尝试遍历列表时,列表会被修改。

您应该创建所选项目列表的副本并循环访问它:

@FXML
private void handleDeleteAction(ActionEvent event) {
    List<Transaction> selectedTransactions = new ArrayList<>(transactionTable.getSelectionModel().getSelectedItems());
    for (Transaction transaction : selectedTransactions) {
        RemoveTransactionsCommand removeTransactionsCommand = new RemoveTransactionsCommand(transaction, selectedTransactions, data);
        commandRegistry.executeCommand(removeTransactionsCommand);
    }
}

(并将RemoveTransactionsCommandselectedItems的类型改为List<Transaction>)。