setValueAt для значения флажка в многострочном массиве JTable - PullRequest
0 голосов
/ 30 апреля 2018

В настоящее время у меня проблема с установкой значений флажка в JTable. Мне нужно хранить логические значения для каждого флажка в строках таблицы. Я могу отобразить флажок по умолчанию (false), но как только я нажму флажок, я получу исключение; java.lang.ArrayIndexOutOfBoundsException: 0. Я не слишком знаком с мульти-массивами с Boolean и не могу понять, какая часть моего кода неверна.

public static final int CHECKBOX= 0;
private final List<Data> datas;
private static boolean CHECKBOX_RENDERED[][] = new boolean[][]{};
private static Arrays array = null;

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    if (rowIndex >= this.datas.size()) {
        return null;
    }

    Data theData= this.datas.get(rowIndex);
    if (theData== null) {
        return null;
    }

    //Initialize the boolean field with table dimension
    CHECKBOX_RENDERED = new boolean[datas.size()][columnIndex];

    switch(columnIndex) {
    case CHECKBOX:
        array.fill(CHECKBOX_RENDERED[rowIndex], false);
        return false; //default
    default:
        throw new IllegalArgumentException("Invalid column index");
    }
}


@Override
public void setValueAt(Object value, int row, int column) {
    if (column == CHECKBOX) {
        Data data= this.datas.get(row);
        if (data!= null && value instanceof Boolean) {

            if (CHECKBOX_RENDERED[row][column]) {
                CHECKBOX_RENDERED[row][column] = false;
            } else {
                CHECKBOX_RENDERED[row][column] = true;
            }

            fireTableCellUpdated(row, column);
        }
    }
}

1 Ответ

0 голосов
/ 30 апреля 2018
private static boolean CHECKBOX_RENDERED[][] = new boolean[][]{};

Вы определяете переменную 2D-массива, но фактически никогда не определяете размер для строк и столбцов массива. Поэтому размер массива равен (0, 0), и вы не можете добавлять / изменять какие-либо данные в массиве.

Не создавайте свою собственную модель стола.

Самое простое решение - просто использовать DefaultTableModel. Он будет управлять данными для вас. Вам просто нужно определить количество строк / столбцов, которое вы хотите в таблице, и он будет управлять остальными для вас.

Или, если вы не знаете, сколько строк вам нужно, вы можете использовать метод addRows(...) для динамического добавления строк по мере необходимости.

...