public void removeMessages(Message[] removedMessages) { try { // Translate the array of removed Message instances into a list of all the row indexes to be // removed from the model. // Assumes the list of removed messages is small. ArrayList<Integer> deadIndexes = new ArrayList<Integer>(); for (Message message : removedMessages) { int deadIndex = messages.indexOf(message); if (deadIndex != -1) { deadIndexes.add(deadIndex); } } // Actually remove the rows, notifying the listeners as we go (rather than bother trying to // coalesce). for (int i = deadIndexes.size() - 1; i >= 0; --i) { int deadIndex = deadIndexes.get(i); messages.remove(deadIndex); fireTableRowsDeleted(deadIndex, deadIndex); } } catch (Exception ex) { ex.printStackTrace(); } }