How to add JCheckBox in JTable?

java, jframe, sql, swing

Solution

Start with How to use tables.

Your table model needs several things.

- It needs to return `Boolean.class` from the `getColumnClass` method for the appropriate column. You will need to override this method.

- The method `isCellEditable` will need to return `true` for the table column you want to make editable (so the user can change the value of the column)

- You're table model will need to be capable of holding the value for the column

- Make sure you pass a valid value for the `boolean` column for the row, otherwise it will be `null`

Updated with simple example

import java.awt.EventQueue;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TableTest {

  public static void main(String[] args) {
    new TableTest();
  }

  public TableTest() {
    startUI();
  }

  public void startUI() {
    EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
        try {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
          ex.printStackTrace();
        }

        MyTableModel model = new MyTableModel();
        model.addRow(new Object[]{0, "Brian", false});
        model.addRow(new Object[]{1, "Ned", false});
        model.addRow(new Object[]{2, "John", false});
        model.addRow(new Object[]{3, "Drogo", false});
        JTable table = new JTable(model);

        JFrame frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
      }
    });
  }

  public class MyTableModel extends DefaultTableModel {

    public MyTableModel() {
      super(new String[]{"ID", "Name", "Present"}, 0);
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
      Class clazz = String.class;
      switch (columnIndex) {
        case 0:
          clazz = Integer.class;
          break;
        case 2:
          clazz = Boolean.class;
          break;
      }
      return clazz;
    }

    @Override
    public boolean isCellEditable(int row, int column) {
      return column == 2;
    }

    @Override
    public void setValueAt(Object aValue, int row, int column) {
      if (aValue instanceof Boolean && column == 2) {
        System.out.println(aValue);
        Vector rowData = (Vector)getDataVector().get(row);
        rowData.set(2, (boolean)aValue);
        fireTableCellUpdated(row, column);
      }
    }

  }

}

Ps- I would HIGHLY recommend you avoid form editors until you have a better understanding of how Swing works - IMHO

Problem

First of all i apologize for my english neglect that i will explain all my problem. First i want JCheckBox in the JTable i have. I am retrieving student id and student name from database in column index 0 and 1. I want third column should be Absent/Present which will initially take whether student is present or absent by JCheckbox Value. Here my code for JTable values : Attendance.java ``` /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package shreesai; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; /** * * @author Admin */ public class Attendance{ Connection con = Connectdatabase.ConnecrDb(); public Vector getEmployee()throws Exception { Vector<Vector<String>> employeeVector = new Vector<Vector<String>>(); PreparedStatement pre = con.prepareStatement("select studentid,name from student"); ResultSet rs = pre.executeQuery(); while(rs.next()) { Vector<String> employee = new Vector<String>(); employee.add(rs.getString(1)); //Empid employee.add(rs.getString(2));//name employeeVector.add(employee); } if(con!=null) con.close(); rs.close(); pre.close(); return employeeVector; } } ``` THIS CODE FOR TAKING VALUES FROM DATABASE SAVING IT INTO VECTOR AttendanceGUI.java ``` /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package shreesai; import static java.awt.Frame.MAXIMIZED_BOTH; import java.util.Vector; import javax.swing.JOptionPane; /** * * @author Admin */ public class AttendanceGUI extends javax.swing.JFrame { /** * Creates new form AttendanceGUI */ private Vector<Vector<String>> data; private Vector<String> header; public AttendanceGUI() throws Exception { this.setLocationRelativeTo(null); setExtendedState(MAXIMIZED_BOTH); Attendance att = new Attendance(); data = att.getEmployee(); header = new Vector<String>(); header.add("Student ID"); header.add("Student Name"); header.add("Absent/Present"); initComponents(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); AttendanceT = new javax.swing.JTable(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); AttendanceT.setModel(new javax.swing.table.DefaultTableModel( data,header )); jScrollPane1.setViewportView(AttendanceT); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(397, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(89, Short.MAX_VALUE)) ); pack(); }// </editor-fold> /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(AttendanceGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { try{ new AttendanceGUI().setVisible(true); } catch(Exception e){ JOptionPane.showMessageDialog(null,e); } } }); } // Variables declaration - do not modify private javax.swing.JTable AttendanceT; private javax.swing.JScrollPane jScrollPane1; // End of variables declaration } ``` My problemis that I can't add a `JCheckBox` in front of every student I have seen `JTabel` model, renderer and all but I don't get anything. I want something like this... I've search for this stuff for a couple of weeks but did bot get anything suitable for this

Original source