import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class JTableWithButtonAndCheckbox {
public static void main(String[] args) {
JFrame frame = new JFrame("JTable with Button and Checkbox");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyTableModel tableModel = new MyTableModel();
JTable table = new JTable(tableModel);
JButtonRenderer buttonRenderer = new JButtonRenderer();
JButtonEditor buttonEditor = new JButtonEditor(new JCheckBox());
JCheckBoxRenderer checkboxRenderer = new JCheckBoxRenderer();
JCheckBoxEditor checkboxEditor = new JCheckBoxEditor(new JCheckBox());
TableColumn buttonColumn = table.getColumnModel().getColumn(1);
buttonColumn.setCellRenderer(buttonRenderer);
buttonColumn.setCellEditor(buttonEditor);
TableColumn checkboxColumn = table.getColumnModel().getColumn(2);
checkboxColumn.setCellRenderer(checkboxRenderer);
checkboxColumn.setCellEditor(checkboxEditor);
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
public static class MyTableModel extends AbstractTableModel {
private Object[][] data = {{"Item 1", null, false}, {"Item 2", null, false}};
private String[] columnNames = {"Name", "Button", "Checkbox"};
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public Object getValueAt(int row, int col) {
return data[row][col];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public boolean isCellEditable(int row, int col) {
return col != 0;
}
@Override
public void setValueAt(Object aValue, int row, int col) {
data[row][col] = aValue;
fireTableCellUpdated(row, col);
}
}
public static class JButtonRenderer extends JButton implements TableCellRenderer {
public JButtonRenderer() {
setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setText((value == null) ? "" : value.toString());
return this;
}
}
public static class JButtonEditor extends DefaultCellEditor {
private JButton button;
public JButtonEditor(JCheckBox checkBox) {
super(checkBox);
button = new JButton();
button.setOpaque(true);
button.addActionListener(e -> fireEditingStopped());
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
button.setText((value == null) ? "" : value.toString());
return button;
}
}
public static class JCheckBoxRenderer extends JCheckBox implements TableCellRenderer {
public JCheckBoxRenderer() {
setOpaque(true);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setSelected((value != null && (Boolean) value));
return this;
}
}
public static class JCheckBoxEditor extends DefaultCellEditor {
private JCheckBox checkBox;
public JCheckBoxEditor(JCheckBox checkBox) {
super(checkBox);
this.checkBox = new JCheckBox();
this.checkBox.setOpaque(true);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
checkBox.setSelected((value != null && (Boolean) value));
return checkBox;
}
}
}