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