SetValueAt для значения флажка в JTable Multiarray

В настоящее время у меня проблема с установкой значений флажка в 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);
        }
    }
}

Чтобы быстрее помочь, отправьте минимальный воспроизводимый пример или Краткий, автономный, правильный пример.

Andrew Thompson 30.04.2018 16:56

С ответом camickr я смог найти другие места для исправления моего кода, и это решило проблему. Я переместил строку CHECKBOX_RENDERED = new boolean [datas.size ()] [columnIndex]; после строки, в которую загружаются данные. Я полностью удалил поле массива и вернул CHECKBOX_RENDERED [rowIndex] [columnIndex]; в случае CHECKBOX оператора switch.

In-young Choung 30.04.2018 17:11
...after the line where data is loaded. - и этот код даже не был включен в вопрос. Вот почему вас попросили публиковать правильный "MCVE / SSCCE" с каждым вопросом.
camickr 30.04.2018 17:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
private static boolean CHECKBOX_RENDERED[][] = new boolean[][]{};

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

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

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

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

Спасибо за быстрый ответ. но я определил значение для поля CHECKBOX_RENDERED = new boolean [datas.size ()] [columnIndex]; в методе getValueAt.

In-young Choung 30.04.2018 16:47

Мой вопрос: я заполнил переменную массива array.fill (CHECKBOX_RENDERED [rowIndex], false); и как я могу сбросить логическое значение в методе setValueAt?

In-young Choung 30.04.2018 16:50

Где вы когда-нибудь добавляли элементы в список "данных"? Размер массива необходимо определить при создании класса. Когда вы добавляете логику к методу getValueAt (), вы будете воссоздавать массив каждый раз при вызове метода !!! Добавьте оператор System.out.println (...) в getValueAt (), чтобы узнать, сколько раз вызывается этот метод. Опять же, я предлагаю вам просто использовать DefaultTableModel, пока вы не изучите основы использования JTable.

camickr 30.04.2018 16:51

Да, у вас есть хорошая мысль .. Я не должен определять значение в getValueAt () ..

In-young Choung 30.04.2018 16:53

@ In-youngChoung, You have a good point - рад, что помог. Не забудьте «принять» ответ, нажав на галочку, чтобы люди знали, что проблема решена.

camickr 30.04.2018 16:57

Конечно, сделаю, но это не полностью решило мою проблему.

In-young Choung 30.04.2018 16:58

@ In-youngChoung Это решило проблему для этого заданного вопроса. Это не 20 вопросов. У вас есть время, чтобы понять предложение и внести свои собственные исправления. Мы здесь не для того, чтобы отлаживать каждую строку кода. Это базовое решение проблемы, когда вам нужно улучшить свои навыки отладки. Такие вещи, как добавление в код операторов System.out.println (...), чтобы увидеть, что происходит. А предложение использовать DefaultTableModel решит все ваши проблемы.

camickr 30.04.2018 17:00

Если вам нужно попрактиковаться в создании собственной модели таблицы, начните с примера из учебника Swing по [Создание модели таблицы]. Опубликованный вами код не похож на базовый пример из учебника. Нет необходимости в какой-либо логике обработки в методах getValueAt () или setValueAt ().

camickr 30.04.2018 17:04

Другие вопросы по теме