从TableView中删除多行

时间:2016-10-21 17:37:51

标签: javafx multipleselection

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

为什么在我选择多行的情况下它不起作用,我的意思是删除一行(有时两行,但无法找到决定它的行)

这是命令实现:

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

1 个答案:

答案 0 :(得分:3)

问题是当表格中的项目列表发生变化时,所选项目列表可能会发生变化。因此,当您尝试迭代列表时,列表会被修改。

您应该创建所选项目列表的副本,然后通过它进行迭代:

@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);
    }
}

(并将selectedItems中的RemoveTransactionsCommand类型更改为List<Transaction>)。