1

在我的应用程序中有一个 JTable,我想在创建表后插入行。

以下所有代码都在框架的构造函数中。

代码:

private TableModel model = new AbstractTableModel(){
String[] columnNames = {"First Name","Last Name","Sport","# of Years","Vegetarian"};
private Object[][] data = {};

            public int getColumnCount() {
                return columnNames.length;
            }

            public int getRowCount() {
                return data.length;
            }

            public String getColumnName(int col) {
                return columnNames[col];
            }
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }

            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
            public boolean isCellEditable(int row, int col) {
                retuen false;
            }
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
};

table = new JTable(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);

JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(5, 218, 884, 194);
//now adding this to the frame where I want to show 
frame.add(scrollPane);

现在我想在表中插入行或数据。这怎么可能。以前我使用DefaultTableModel但我们不能在 DefaultTableModel 中使用 isCellEditable 和其他方法,所以我用上面的代码更改了它。但在上面的代码中,我无法明确插入数据(行),请帮助我。

4

5 回答 5

7

像这样,您可以实现其他方法,如 deleteRow(int rowIndex) 和 insertRowToIndex(int rowIndex, List rowData)。

记住更改数据后,您必须触发表格事件,例如 fireTableRowsInserted() 等

public static class MyTableModel extends AbstractTableModel
{
    private List<String> columnNames = new ArrayList();
    private List<List> data = new ArrayList();

    {
        columnNames.add("First Name");
        columnNames.add("Last Name");
        columnNames.add("Sport");
        columnNames.add("# of Years");
        columnNames.add("Vegetarian");
    }

    public void addRow(List rowData)
    {
        data.add(rowData);
        fireTableRowsInserted(data.size() - 1, data.size() - 1);
    }

    public int getColumnCount()
    {
        return columnNames.size();
    }

    public int getRowCount()
    {
        return data.size();
    }

    public String getColumnName(int col)
    {
        try
        {
            return columnNames.get(col);
        }
        catch(Exception e)
        {
            return null;
        }
    }

    public Object getValueAt(int row, int col)
    {
        return data.get(row).get(col);
    }

    public boolean isCellEditable(int row, int col)
    {
        return false;
    }

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

public static void main(String[] args)
{
    MyTableModel model = new MyTableModel();

    model.addRow(Arrays.asList("yi", "chen", "sleep", 35, true));

    JTable table = new JTable(model);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setFillsViewportHeight(true);

    JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setBounds(5, 218, 884, 194);
    //now adding this to the frame where I want to show 
    JFrame frame = new JFrame();
    frame.add(scrollPane);
    frame.setVisible(true);
}
于 2012-03-14T08:08:22.623 回答
1

只是从扩展DefaultTableModel 而不是从扩展AbstractTableModel应该可以解决问题。

于 2012-03-14T07:38:15.563 回答
1

AbstractTableModel 不会做你想做的事,为此你需要使用 DefaultTableModel,

当您使用 DefaultTableModel 时,您可以通过以下方式设置 isCellEditable 或任何其他方法,

    DefaultTableModel model = new DefaultTableModel(data, columnNames) {
        private static final long serialVersionUID = 1L;

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }       
    };

在上面的代码中,数据将是 String[ ][ ]。通过编写上面的代码,您将单元格可编辑设置为 false。

除此之外,您还可以像您可能所做的那样在 swingworker 或后记中加载数据。

于 2012-03-14T07:45:03.197 回答
1

@Peter 是正确的 +1 使用DefaultTableModel而不是AbstractTableModel,因为您AbstractTableModel错过了方法addRow();(以及其他方法)

public void addRow(Object[][] data) {
    this.data.add(data);
    this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
}

关于AbstractTableModel的示例

于 2012-03-14T07:49:14.387 回答
0

我认为您需要setValueAt()在 AbstractTableModel 中实现功能,以便您可以修改给定位置的任何数据。

仔细查看以下教程:

http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm

http://www.informit.com/articles/article.aspx?p=332278

于 2012-03-14T07:49:17.570 回答