Question

I've some data that loaded from my db and stored in a another class as a public static List,i can't access my data in MyTableModel class to store and see them in the jtable... there are many other ways exist to filling table with my data but they don't give me an column check boxesh...what should i do?

    class MyTableModel extends AbstractTableModel {
    private String[] columnNames = {"UserName","Admin","Blocked"};
    private Object[Size][3] data;
    //size is an variable thing witch i get it from db,uses as number of the row;
    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];
    }

    public Class getColumnClass(int c) {
       return getValueAt(0, c).getClass();
    }

    public boolean isCellEditable(int row, int col) {
        if (col < 2) {
           return false;
        } else {
           return true;
        }
    }

    public void setValueAt(Object value, int row, int col) {
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }

    }    
Was it helpful?

Solution

You should avoid using object.getClass() to return the class type of the column. What happens if that value just happens to be the only null value in the data set?

Instead, you should be passing back the actual column class...(nb Without you actually data, I have no idea about what values should be passed, so this is just an example...)

public Class getColumnClass(int c) {
    return c < 2 ? String.class : Boolean.class;
}

Updated

For JTable to display a JCheckBox, the table model must return Boolean from the model getColumnClass method...This is the simplest solution, then again, you could simple supply a custom cell renderer for the specific column.

enter image description here

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class TestTable11 {

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

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

                TableModel model = new SimpleTableModel();

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(new JTable(model)));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class SimpleTableModel extends AbstractTableModel {

        private List<Object[]> rows;

        public SimpleTableModel() {
            rows = new ArrayList<>(5);
            rows.add(new Object[]{"Test1", "Test2", false});
            rows.add(new Object[]{"Test3", "Test4", false});
            rows.add(new Object[]{"Test5", "Test6", false});
            rows.add(new Object[]{"Test7", "Test8", false});
            rows.add(new Object[]{"Test9", "Test10", false});
            rows.add(new Object[]{"Test11", "Test11", false});
        }

        @Override
        public int getRowCount() {
            return rows.size();
        }

        @Override
        public int getColumnCount() {
            return 3;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return rows.get(rowIndex)[columnIndex];
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return columnIndex == 2;
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return columnIndex < 2 ? String.class : Boolean.class;
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            if (columnIndex == 2 && aValue instanceof Boolean) {
                rows.get(rowIndex)[columnIndex] = aValue;
            }
        }        
    }    
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top