从JTable获取所选行的内容作为Objects的ArrayList

时间:2015-03-05 08:17:11

标签: java arrays swing arraylist jtable

我想将所选行的内容收集到Object类型的数组中。要收集所有选定行的内容,应将这些数组添加到稍后返回的arraylist中。

简化方法:

Content of row --> Object[i] = content of column 1...2...3...i
ArrayList<Object[]> add <-- Object[]

ArrayList应该是这样的:

list {

[(content of row(0), col(0)), content of row(0), col(1)), content of row(0), col(1))],

[(content of row(1), col(0)), content of row(1), col(1)), content of row(1), col(1))]


[(content of row(2), col(0)), content of row(2), col(1)), content of row(2), col(1))]

} 

在下面你将找到我到目前为止的代码,但这不能正常工作,我得到空指针异常。

public static ArrayList<Object[]> getSelectedTaskAsList() {
    ArrayList<Object[]> tasks = new ArrayList<Object[]>();

    if (table.getSelectedRowCount() > 0) { // check if there are selected rows
        int[] selectedRows = table.getSelectedRows();
        Object[] taskAsArray = null;
        for (int i = 0; i < selectedRows.length; i++) { // print all selected tasks
            for (int j = 0; j < table.getColumnCount(); j++) {
                taskAsArray[j] = (table.getValueAt(table.convertRowIndexToModel(selectedRows[i]),table.convertColumnIndexToModel(j)));
            }
            tasks.add(taskAsArray);
        }
    }
    return tasks;
}

首先,我想知道我的方法是否“好”,或者是否太难或是否有替代方法。将表中的第一个值添加到taskAsArray[]数组时会发生空指针异常。

3 个答案:

答案 0 :(得分:1)

您应始终指明获得例外的位置。但首先你应该改变这个

    Object[] taskAsArray = null;
    for (int i = 0; i < selectedRows.length; i++) { // print all selected tasks
        for (int j = 0; j < table.getColumnCount(); j++) {
            taskAsArray[j] = (table.getValueAt(table.convertRowIndexToModel(selectedRows[i]),table.convertColumnIndexToModel(j)));
        }
        tasks.add(taskAsArray);
    }

    Object[] taskAsArray = new Object[table.getColumnCount()];
    for (int i = 0; i < selectedRows.length; i++) { // print all selected tasks
        for (int j = 0; j < table.getColumnCount(); j++) {
            taskAsArray[j] = (table.getValueAt(table.convertRowIndexToModel(selectedRows[i]),table.convertColumnIndexToModel(j)));
        }
        tasks.add(taskAsArray);
    }

答案 1 :(得分:1)

将代码更改为

    Object[] taskAsArray = null;
    for (int i = 0; i < selectedRows.length; i++) { // print all selected tasks
        taskAsArray=new Object[table.getColumnCount()]; //<--- the added array init
        for (int j = 0; j < table.getColumnCount(); j++) {
            taskAsArray[j] = (table.getValueAt(table.convertRowIndexToModel(selectedRows[i]),table.convertColumnIndexToModel(j)));
        }
        tasks.add(taskAsArray);
    }

答案 2 :(得分:1)

taskArray未正确声明。此外,如果我正确理解您的描述,您应该为每个选定的行都有一个Object数组。

将声明更改为:

Object[] taskArray = new Object[table.getColumnCount()];

并将其移到第一个for循环中。