简体   繁体   English

动态将数据添加到AbstractTableModel的Extended类

[英]adding data dynamically to the Extended class of AbstractTableModel

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? 我有一些从数据库加载的数据并作为公共静态列表存储在另一个类中,我无法访问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);
    }

    }    

You should avoid using object.getClass() to return the class type of the column. 您应该避免使用object.getClass()返回列的类类型。 What happens if that value just happens to be the only null value in the data set? 如果该值恰好是数据集中唯一的null值,会发生什么情况?

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...) 相反,您应该传递实际的列类...(nb,如果没有实际数据,我不知道应该传递什么值,所以这只是一个示例...)

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. 为了让JTable显示JCheckBox ,表模型必须从模型getColumnClass方法返回Boolean 。这是最简单的解决方案,然后,您可以简单地为特定列提供自定义单元格渲染器。

在此处输入图片说明

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM