Search code examples
javaswingjtablejbuttonsettext

JButton inside JTable: Button working, but text vanishes on click


I have a Jtable with a button on each row to delete the row. The Text is set to "Delete". When I select the button, the text vanishes. How can I set the text for selected button?

Renderer:

public class JButtonRenderer  extends JButton implements TableCellRenderer {

    public JButtonRenderer(){
        this.setText("Delete");
    }

    @Override
    public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4,
            int arg5) {
        return this;
    }
}

Editor:

public class DeleteButtonCellEditor extends AbstractCellEditor implements
TableCellEditor {

private JButton button = new JButton();

private static final long serialVersionUID = 1L;

public DeleteButtonCellEditor(){
    button.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0) {
              //Perform Button Actions
        }
    });
}

@Override
public Object getCellEditorValue() {
    return "Delete";
}

@Override
public Component getTableCellEditorComponent(JTable arg0, Object arg1, boolean arg2, int arg3, int arg4) {
    return button;
}
}

Solution

  • try use this class with TableCellEditor, TableCellRenderer

    class JButtonRenderer extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
    
            public JButtonRenderer() {
            }
    
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                JButton b = new JButton("Delete");
                return b;
            }
    
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, final int row, int column) {
                JButton b = new JButton("Delete");
                b.addActionListener(new java.awt.event.ActionListener() {
    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // code
                    }
                });
                return b;
            }
    
            @Override
            public Object getCellEditorValue() {
                return null;
            }
    
            @Override
            public boolean isCellEditable(EventObject anEvent) {
                return true;
            }
    
            @Override
            public boolean shouldSelectCell(EventObject anEvent) {
                return true;
            }
        }
    

    and using:

    JButtonRenderer compCellDelete = new JButtonRenderer();
    
    jTable1.getColumnModel().getColumn(your_column_index).setCellEditor(compCellDelete);
    jTable1.getColumnModel().getColumn(your_column_index).setCellRenderer(compCellDelete);