aspose file tools*
The moose likes Swing / AWT / SWT and the fly likes JCheckBox in JTable Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login

Win a copy of The Java EE 7 Tutorial Volume 1 or Volume 2 this week in the Java EE forum
or jQuery UI in Action in the JavaScript forum!
JavaRanch » Java Forums » Java » Swing / AWT / SWT
Bookmark "JCheckBox in JTable" Watch "JCheckBox in JTable" New topic

JCheckBox in JTable

Sandhya ChowhanPawar

Joined: Nov 21, 2001
Posts: 2
I am having trouble displaying a JCheckBox in a JTable. I am using table model to populate the table, however for the checkbox in a column is not displayed so I have to use text instead? I've tried using the render but it doesn't display the checkbox either.
Paul Stevens
Ranch Hand

Joined: May 17, 2001
Posts: 2823
What are you putting in the column? You need to put in Boolean. The JCheckbox will appear automatically. If you are using Boolean values, post some code so we can see what you are doing.

Joined: Sep 21, 2001
Posts: 17
compile and run this...
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.DefaultCellEditor;
import javax.swing.JScrollPane;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.awt.*;
import java.awt.event.*;
public class TableEditDemo extends JFrame {
private boolean DEBUG = true;
public TableEditDemo() {
MyTableModel myModel = new MyTableModel();
JTable table = new JTable(myModel);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Set up real input validation for the integer column.
//Add the scroll pane to this window.
getContentPane().add(scrollPane, BorderLayout.CENTER);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
private void setUpIntegerEditor(JTable table) {
//Set up the editor for the integer cells.
final WholeNumberField integerField = new WholeNumberField(0, 5);
DefaultCellEditor integerEditor =
new DefaultCellEditor(integerField) {
//Override DefaultCellEditor's getCellEditorValue method
//to return an Integer, not a String:
public Object getCellEditorValue() {
return new Integer(integerField.getValue());
table.setDefaultEditor(Integer.class, integerEditor);
class MyTableModel extends AbstractTableModel {
final String[] columnNames = {"First Name",
"Last Name",
"# of Years",
final Object[][] data = {
{"Mary", "Campione",
"Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml",
"Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath",
"Chasing toddlers", new Integer(2), new Boolean(false)},
{"Mark", "Andrews",
"Speed reading", new Integer(20), new Boolean(true)},
{"Angela", "Lih",
"Teaching high school", new Integer(4), new Boolean(false)}
public int getColumnCount() {
return columnNames.length;

public int getRowCount() {
return data.length;
public String getColumnName(int col) {
return columnNames[col];
public Object getValueAt(int row, int col) {
return data[row][col];
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
* Don't need to implement this method unless your table's
* editable.
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
data[row][col] = value;
fireTableCellUpdated(row, col);
if (DEBUG) {
System.out.println("New value of data:");
private void printDebugData() {
int numRows = getRowCount();
int numCols = getColumnCount();
for (int i=0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++) {
System.out.print(" " + data[i][j]);
public static void main(String[] args) {
TableEditDemo frame = new TableEditDemo();
i hope it clarifies ur doubt...that for showing check boxes in table u just need to have boolean values in the table.
u need to override the renderer class only when u want to customixe the way the cells in the table r presented !!
[This message has been edited by NIKHIL EROS (edited November 21, 2001).]
Sandhya ChowhanPawar

Joined: Nov 21, 2001
Posts: 2
thanks nikhil and paul!
i've tried using a similar example and it works, its just that when i assign " final Object[][] data = ... " differently it is not working, maybe because I want that boolean col to be editable. so basically i'm in using a 2d vector inseading of decl like u had it ... checkit out:
Vector dataModelVector = new Vector();
String userName = "Sam";
String userLastname = "Smith";
Boolean local = Boolean.TRUE;
dataModelVector.addElement(userName );
col.add("First Name");
col.add("Last Name");

model = new DefaultTableModel(tableModelVector, col){
public boolean isCellEditable(int r, int c){ return (c ==2)
public String getColumnName(int column) { return col.elementAt(column).toString(); }
public Object getValueAt(int row, int column) { return (Vector)tableModelVector.elementAt(row)).elementAt(column);
public void setValueAt(Object value, int row, int column){
if (value instanceOf Boolean && c==2)
((Vector)tableModelVector.elementAt(row)).setElementAt(value, Boolean.TRUE);
((Vector)tableModelVector.elementAt(row)).setElementAt(value, column);
fireTableCellUpdated(row, column);
thanks guys!
Consider Paul's rocket mass heater.
subject: JCheckBox in JTable