The first column contains the buttons and if you click on any and then add lines, then a white line remains when adding lines. How to update the table normally. enter image description here

package main; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.LinkedList; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import java.awt.BorderLayout; import java.awt.Component; import javax.swing.JPanel; import javax.swing.AbstractCellEditor; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; public class TableTest { private JFrame frame; private JTable table; private TableModel model; private int count = 0; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { TableTest window = new TableTest(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public TableTest() { initialize(); } private void initialize() { frame = new JFrame(); frame.setTitle("Example"); frame.setBounds(100, 100, 450, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JScrollPane scrollPane = new JScrollPane(); frame.getContentPane().add(scrollPane, BorderLayout.CENTER); model = new TableModel(); model.addRow(createRow()); table = new JTable(model); table.setDefaultRenderer(String.class, new RowRender()); table.getColumnModel().getColumn(0).setCellEditor(new ButtonEditor()); table.getColumnModel().getColumn(0).setCellRenderer(new ButtonRenderer()); // table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); scrollPane.setViewportView(table); JPanel panel = new JPanel(); frame.getContentPane().add(panel, BorderLayout.SOUTH); JButton btnClear = new JButton("CLEAR"); btnClear.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { getModel().clearHistory(); } }); JButton btnCreateRow = new JButton("CREATE ROW"); btnCreateRow.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { getModel().addRow(createRow()); } }); panel.add(btnCreateRow); panel.add(btnClear); } class TableModel extends AbstractTableModel { private String[] column = { "One", "Two" }; private LinkedList<ArrayList<Object>> rows; private static final long serialVersionUID = 1L; TableModel() { this.rows = new LinkedList<>(); } public String getColumnName(int columnIndex) { for (int i = 0; i < column.length; i++) { if (i == columnIndex) { return column[i]; } } return ""; } @Override public int getColumnCount() { return column.length; } @Override public int getRowCount() { return rows.size(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return rows.get(rowIndex).get(columnIndex); } public Class<?> getColumnClass(int columnIndex) { return String.class; } void addRow(ArrayList<Object> row) { rows.addFirst(row); while (rows.size() >= 11) { rows.removeLast(); } fireTableRowsInserted(0, getRowCount()); } public boolean isCellEditable(int rowIndex, int columnIndex) { if (columnIndex == 0) { return true; } return false; } public void clearHistory() { rows.clear(); fireTableDataChanged(); } } public TableModel getModel() { return model; } public ArrayList<Object> createRow() { ArrayList<Object> row = new ArrayList<Object>(); JButton button = new JButton(count + " Click me"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(frame, "Pressed"); } }); row.add(button); row.add("Text"); count++; return row; } class ButtonEditor extends AbstractCellEditor implements TableCellEditor { private static final long serialVersionUID = 1L; private JButton jButton; public ButtonEditor() { } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { jButton = (JButton) value; return (JButton) value; } public Object getCellEditorValue() { return jButton; } public JButton getjButton() { return jButton; } public void setjButton(JButton jButton) { this.jButton = jButton; } } public class ButtonRenderer implements TableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { return (Component) value; } } public class RowRender extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setHorizontalAlignment(SwingConstants.CENTER); return cell; } } } 
  • I have your code clicking on Clear all lines erases. Or explain normally how to get an error. - Denis
  • @Denis he already wrote in the comments to another answer, first press the "Click me" button, then on the "Create Row". I myself can not understand where the error is, it seems that render comes into conflict with the editor - Aleksei Chibisov

2 answers 2

You need to tell the table that editing is complete. Otherwise, the table considers that the cell is still being edited, and does not redraw it. To do this, there is the AbstractCellEditor.stopCellEditing method. You can add another Button click listener to your ButtonEditor.getTableCellEditorComponent :

 public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { jButton = (JButton) value; jButton.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ButtonEditor.this.stopCellEditing(); jButton.removeActionListener( this ); } }); return (JButton) value; } 

Please note that an anonymous class is used, not lambda, because To remove a listener, you need a link to it ( this ). You can also make ButtonEditor implementation.

    Try this

     tableModel.fireTableDataChanged() 
    • equally that one — that this option — button is not erased. - S. Oleg