Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Get ready to get you hands dirty.</p> <p>At some point, <code>DefaultTableModel</code> will no longer meet your needs and you should be prepared to roll your own implementation.</p> <p>First things first. You're working in an Object Orientated language, you should take advantage of this fact and represent your data as objects.</p> <p>Secondly, when deleting multiple values from a table, it becomes really tricky quickly. Once you remove the first row, the indices no longer match, you need some way to map the values back to the index that they appear within the model.</p> <p>Thirdly, the visible row indices may not be the same as those of the model, this is especially true when the table is sorted.</p> <pre><code>import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.AbstractTableModel; public class TestJTable { public static void main(String[] args) { new TestJTable(); } public TestJTable() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } List&lt;Pet&gt; pets = new ArrayList&lt;&gt;(25); pets.add(new Pet("Tyrannosauridae", "TYRANNOSAURUS", 20, 35)); pets.add(new Pet("Dromaeosauridae", "VELOCIRAPTOR", 45, 90)); pets.add(new Pet("Ceratopsidae", "TRICERATOPS", 15, 30)); pets.add(new Pet("Stegosauridae", "STEGOSAURUS", 22, 25)); pets.add(new Pet("Titanosauridae", "MALAWISAURUS", 22, 25)); pets.add(new Pet("Compsognathidae", "COMPSOGNATHUS", 8, 25)); pets.add(new Pet("Brachiosauridae", "BRACHIOSAURUS", 8, 25)); pets.add(new Pet("Diplodocidae", "DIPLODOCUS", 8, 25)); final PetTableModel model = new PetTableModel(pets); final JTable table = new JTable(model); InputMap im = table.getInputMap(JTable.WHEN_FOCUSED); ActionMap am = table.getActionMap(); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "delete"); am.put("delete", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { int[] indices= table.getSelectedRows(); // Convert the view's row indices to the models... int[] mapped = new int[indices.length]; for (int index = 0; index &lt; indices.length; index++) { mapped[index] = table.convertRowIndexToModel(indices[index]); } model.removePets(mapped); } }); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class PetTableModel extends AbstractTableModel { private List&lt;Pet&gt; pets; public PetTableModel() { pets = new ArrayList&lt;&gt;(25); } public PetTableModel(List&lt;Pet&gt; pets) { this.pets = pets; } @Override public int getRowCount() { return pets.size(); } public void removePets(int... indicies) { // Build a tempory list of Pet objects based // on the supplied indices... List&lt;Pet&gt; old = new ArrayList&lt;&gt;(indicies.length); for (int index : indicies) { old.add(pets.get(index)); } // For each pet, get it's index in the model // remove it from the model // notify any listeners of the change to the model... for (Pet pet : old) { int index = pets.indexOf(pet); pets.remove(pet); fireTableRowsDeleted(index, index); } } @Override public Class&lt;?&gt; getColumnClass(int columnIndex) { Class clazz = String.class; switch (columnIndex) { case 2: case 3: clazz = Float.class; } return clazz; } @Override public String getColumnName(int column) { String name = "??"; switch (column) { case 0: name = "Breed"; break; case 1: name = "Category"; break; case 2: name = "Buy Price"; break; case 3: name = "Sell Price"; break; } return name; } @Override public int getColumnCount() { return 4; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Pet pet = pets.get(rowIndex); Object value = null; switch (columnIndex) { case 0: value = pet.getBreed(); break; case 1: value = pet.getCategory(); break; case 2: value = pet.getBuyPrice(); break; case 3: value = pet.getSellPrice(); break; } return value; } public void add(Pet pet) { pets.add(pet); fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1); } } public class Pet { private String breed; private String category; private float buyPrice; private float sellPrice; public Pet(String breed, String category, float buyPrice, float sellPrice) { this.breed = breed; this.category = category; this.buyPrice = buyPrice; this.sellPrice = sellPrice; } public String getBreed() { return breed; } public float getBuyPrice() { return buyPrice; } public String getCategory() { return category; } public float getSellPrice() { return sellPrice; } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload