How to delete a row from jtable

后端 未结 1 1525
暗喜
暗喜 2020-12-04 01:16

I want to change the action of the button to delete. I have this code:

package buttonexample;

import java.awt.BorderLayout;
import java.awt.Component;
impor         


        
相关标签:
1条回答
  • 2020-12-04 01:36

    The example by camickr is probably a more reusable solution, but for the sake of education...

    • Rendering of cells is the domain of the view
    • Model's should never contain components, especially if you're thinking about rendering them to the screen, this is simply the wrong approach to take...
    • You need to set up a TableCellEditor which will act as the means by which you can retrieve notification of the edit actions (mouse click or keypress)

    This is a basic example, for simplicity, I've used a DefaultTableModel as it has a nice removeRow method, but conceivably, you could use any TableModel, so long as you provided the means to remove a row and modified by the editor to support it...

    enter image description here

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.EventObject;
    import javax.swing.AbstractCellEditor;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.event.CellEditorListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableModel;
    
    public class ButtonExample {
    
        public JTable table;
    
        public static void main(String[] args) {
            final ButtonExample example = new ButtonExample();
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    example.createAndShowGUI();
                }
            });
        }
    
        private void createAndShowGUI() {
            JFrame frame = new JFrame("Button Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            table = new JTable(new ExampleTableModel());
            JScrollPane scrollPane = new JScrollPane(table);
            table.setFillsViewportHeight(true);
    
            table.getColumn("action").setCellRenderer(new ButtonCellRenderer());
            table.getColumn("action").setCellEditor(new ButtonCellEditor());
    
            frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static class ExampleTableModel extends DefaultTableModel {
    
            public ExampleTableModel() {
                super(new Object[]{"id", "stuff", "blah", "action"}, 0);
                for (int index = 0; index < 10; index++) {
                    addRow(new Object[]{index, "Text for " + index, "Na na", index});
                }
            }
    
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return columnIndex == 3;
            }
    
        }
    
        public static class ButtonCellRenderer extends JButton implements TableCellRenderer {
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                if (value != null) {
                    setText("Delete row " + value.toString());
                } else {
                    setText("Delete Me");
                }
                if (isSelected) {
                    setForeground(table.getSelectionForeground());
                    setBackground(table.getSelectionBackground());
                } else {
                    setForeground(table.getForeground());
                    setBackground(UIManager.getColor("Button.background"));
                }
                return this;
            }
        }
    
        public static class ButtonCellEditor extends AbstractCellEditor implements TableCellEditor {
    
            private JButton editor;
            private Object value;
            private int row;
            private JTable table;
    
            public ButtonCellEditor() {
                editor = new JButton();
                editor.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if (table != null) {
                            fireEditingStopped();
                            TableModel model = table.getModel();
                            if (model instanceof DefaultTableModel) {
                                ((DefaultTableModel) model).removeRow(row);
                            }
                        }
                    }
                });
            }
    
            @Override
            public boolean isCellEditable(EventObject e) {
                return true;
            }
    
            @Override
            public Object getCellEditorValue() {
                return value;
            }
    
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
                this.table = table;
                this.row = row;
                this.value = value;
                if (value != null) {
                    editor.setText("Delete row " + value.toString());
                } else {
                    editor.setText("Delete Me");
                }
                if (isSelected) {
                    editor.setForeground(table.getSelectionForeground());
                    editor.setBackground(table.getSelectionBackground());
                } else {
                    editor.setForeground(table.getForeground());
                    editor.setBackground(UIManager.getColor("Button.background"));
                }
                return editor;
            }
        }
    
    }
    

    Take a closer look at How to Use Tables for more details

    This is just a personal preference, but I prefer to use a toolbar or menu item and key bindings to provide this support. Buttons in a table just seem so...dated - IMHO

    0 讨论(0)
提交回复
热议问题