Java 向AbstractTableModel的扩展类动态添加数据

Java 向AbstractTableModel的扩展类动态添加数据,java,swing,jtable,boolean,abstracttablemodel,Java,Swing,Jtable,Boolean,Abstracttablemodel,我有一些数据是从我的数据库加载的,作为一个公共静态列表存储在另一个类中,,我无法访问MyTableModel类中的数据来存储并在jtable中查看它们。。。 有很多其他方法可以用我的数据填充表格,但它们不会给我一个列检查框…我应该怎么做 class MyTableModel extends AbstractTableModel { private String[] columnNames = {"UserName","Admin","Blocked"}; private

我有一些数据是从我的数据库加载的,作为一个公共静态列表存储在另一个类中,,我无法访问MyTableModel类中的数据来存储并在jtable中查看它们。。。 有很多其他方法可以用我的数据填充表格,但它们不会给我一个列检查框…我应该怎么做

    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);
    }

    }    
类MyTableModel扩展了AbstractTableModel{ 私有字符串[]columnNames={“用户名”、“管理员”、“阻止”}; 私有对象[大小][3]数据; //大小是一个变量,我从db中得到它,用作行数; public int getColumnCount(){ 返回columnNames.length; } public int getRowCount(){ 返回数据长度; } 公共字符串getColumnName(int-col){ 返回列名[col]; } 公共对象getValueAt(整数行,整数列){ 返回数据[行][col]; } 公共类getColumnClass(int c){ 返回getValueAt(0,c).getClass(); } 公共布尔值可编辑(int行,int列){ if(col<2){ 返回false; }否则{ 返回true; } } public void setValueAt(对象值、整行、整列){ 数据[行][列]=值; FireTableCell更新(行、列); } }
您应该避免使用
object.getClass()
返回列的类类型。如果该值恰好是数据集中唯一的
null
值,会发生什么情况

相反,您应该传回实际的列类…(注意,如果没有实际的数据,我不知道应该传递什么值,所以这只是一个示例…)


应该避免使用
object.getClass()
返回列的类类型。如果该值恰好是数据集中唯一的
null
值,会发生什么情况

相反,您应该传回实际的列类…(注意,如果没有实际的数据,我不知道应该传递什么值,所以这只是一个示例…)


@默认情况下,ODBC中的user2492820元数据返回可接受的Java数据类型是否有将checkboxesh包含到表中的解决方案?@user2492820如果您的问题没有得到回答,请不要将答案标记为“已回答”(程序员没有冒犯)。这将确保没有其他人会试图回答你的问题。如果您想要一列复选框:确保返回该列的
Boolean.class
(在
getColumnClass(intc)
)并确保
是可编辑的(introw,intcol)
也返回true。@user2492820默认情况下,ODBC中的元数据返回可接受的Java数据类型是否有将checkboxesh包含在表中的解决方案?@user2492820如果您的问题没有得到回答,请不要将答案标记为“已回答”(程序员没有冒犯)。这将确保没有其他人会试图回答你的问题。如果您想要一列复选框:确保返回该列的
Boolean.class
(在
getColumnClass(int c)
)并确保
isCellEditable(int row,int col)
也返回true。
If(col<2){return false;}else{return true;}
可以写在一行上,
返回列>=2而不是4行。
如果(列<2){return false;}否则{return true;}
可以写入一行
返回列>=2而不是4行。
public Class getColumnClass(int c) {
    return c < 2 ? String.class : Boolean.class;
}
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;
            }
        }        
    }    
}