JTable. Deleting rows. Consume the event to not get dispatched further

后端 未结 3 2039
旧时难觅i
旧时难觅i 2021-01-03 14:33

I needed to delete rows from a JTable on the delete key-press. So the use case is quite simple, the user select some rows, press the delete key, the rows get deleted. The co

相关标签:
3条回答
  • 2021-01-03 14:50

    This is MadProgrammer's code but I modified it to work with multiple selected rows at once instead of one by one:

        // Assume table is a JTable instance
        InputMap inputMap = table.getInputMap(JTable.WHEN_FOCUSED);
        ActionMap actionMap = table.getActionMap();
    
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "DeleteRow");
        actionMap.put("DeleteRow", new AbstractAction()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                int[] row = table.getSelectedRows();
    
                for (int i = 0; i < row.length; i++)
                {
                    ((DefaultTableModel) table.getModel()).removeRow(row[i] - i * 1);
                }
            }
        });
    
    0 讨论(0)
  • 2021-01-03 15:09

    Use key bindings instead...

    InputMap im = table.getInputMap(JTable.WHEN_FOCUSED);
    ActionMap am = table.getActionMap();
    
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "DeleteRow");
    am.put("DeleteRow", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
    
            System.out.println("Delete row");
            int row = table.getSelectedRow();
    
            if (row > -1) {
    
                DefaultTableModel model = (DefaultTableModel) table.getModel();
                model.removeRow(row);
    
            }
    
        }
    });
    

    (I borrowed mKorbel data for my test, so my test was using a DefaultTableModel, you will need to cast to the model you are using).

    Also, if you editing, this may still fire, so you will need to check for that

    0 讨论(0)
  • 2021-01-03 15:09
    • your core for removing rows is wrong, have to start with Max index, otherwise deleted unselected row,

    code example

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class RemoveAddRows extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private Object[] columnNames = {"Type", "Company", "Shares", "Price"};
        private Object[][] data = {
            {"Buy", "IBM", new Integer(1000), new Double(80.50)},
            {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
            {"Sell", "Apple", new Integer(3000), new Double(7.35)},
            {"Buy", "Nortel", new Integer(4000), new Double(20.00)},
            {"Buy", "IBM", new Integer(1000), new Double(80.50)},
            {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
            {"Sell", "Apple", new Integer(3000), new Double(7.35)},
            {"Buy", "Nortel", new Integer(4000), new Double(20.00)},
            {"Buy", "IBM", new Integer(1000), new Double(80.50)},
            {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
            {"Sell", "Apple", new Integer(3000), new Double(7.35)},
            {"Buy", "Nortel", new Integer(4000), new Double(20.00)}
        };
        private JTable table;
        private DefaultTableModel model;
    
        public RemoveAddRows() {
            model = new DefaultTableModel(data, columnNames) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public Class getColumnClass(int column) {
                    return getValueAt(0, column).getClass();
                }
            };
            table = new JTable(model);
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
            JScrollPane scrollPane = new JScrollPane(table);
            add(scrollPane);
            JButton button1 = new JButton("Remove all rows");
            button1.addActionListener(new ActionListener() {
    
                public void actionPerformed(ActionEvent arg0) {
                    int[] selectedRows = table.getSelectedRows();
                    for (int i = selectedRows.length - 1; i > -1; i--) {
                        model.removeRow(selectedRows[i]);
                    }
                    /*if (model.getRowCount() > 0) {
                    for (int i = model.getRowCount() - 1; i > -1; i--) {
                    model.removeRow(i);
                    }
                    }*/
                    System.out.println("model.getRowCount() --->" + model.getRowCount());
                }
            });
            JButton button2 = new JButton("Add new rows");
            button2.addActionListener(new ActionListener() {
    
                public void actionPerformed(ActionEvent arg0) {
                    Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)};
                    model.addRow(data0);
                    Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)};
                    model.addRow(data1);
                    Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)};
                    model.addRow(data2);
                    Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)};
                    model.addRow(data3);
                    System.out.println("model.getRowCount() --->" + model.getRowCount());
                }
            });
            JPanel southPanel = new JPanel();
            southPanel.add(button1);
            southPanel.add(button2);
            add(southPanel, BorderLayout.SOUTH);
        }
    
        public static void main(String[] args) {
            RemoveAddRows frame = new RemoveAddRows();
            frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    
    • I'm Win user and never heard beep from Win Platform, have to post an SSCCE
    0 讨论(0)
提交回复
热议问题