Jcheckbox в заголовке таблицы дает исключение - PullRequest
0 голосов
/ 01 июля 2018

Я создал JTable. Заголовок столбца называется "Export" с флажком. Когда мы устанавливаем флажок заголовка, флажки во всех строках также должны быть отмечены.

Вот мой код:

private void initializeTable() {
    tableModel = (DefaultTableModel) locationJTable.getModel();

    locationJTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    tableModelListener = new TableModelListener() {
        @Override
        public void tableChanged(TableModelEvent e) {
            processTableChange(e);
        }
    };
    locationJTable.getModel().addTableModelListener(tableModelListener);

    tableSelectionListener = new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e) {
            //processSelection(e);
        }
    };
    locationJTable.getSelectionModel().addListSelectionListener(tableSelectionListener);

    Map<String, TableColumn> columns = new HashMap<String, TableColumn>() {
        {
            put("Export", locationJTable.getColumnModel().getColumn(INDEX_OF_THE_EXPORT_COLUMN));
        }
    };

    for (Map.Entry<String, TableColumn> entry : columns.entrySet()) {
        TableColumn column = entry.getValue();
        ItemListener itemListener = (ItemEvent e)
                -> {
            Object source = e.getSource();
            if (source instanceof AbstractButton == false) {
                return;
            }

            boolean checked = e.getStateChange() == ItemEvent.SELECTED;
            for (int x1 = 0, y1 = locationJTable.getRowCount(); x1 < y1; x1++) {
                **if ((boolean) locationJTable.getValueAt(x1, column.getModelIndex()) != checked)** {
                    locationJTable.setValueAt(checked, x1, column.getModelIndex());
                }
            }
        };

        boolean selected = true;
        if (entry.getKey().equals("Export")) {
            selected = false;
        }

        CheckBoxHeader header = new CheckBoxHeader(itemListener, selected, entry.getKey(), column.getModelIndex());
        locationJTable.getTableHeader().setBackground(new Color(255, 255, 255));
        column.setHeaderRenderer(header);
        checkBoxHeaders.put(header, itemListener);
    }
}

Я вызываю эту функцию в конструкторе. Когда я ставлю флажок в заголовке вместо того, чтобы устанавливать другие флажки, он показывает NullPointerException. Но если я сначала поставлю флажок в строке, а затем поставлю флажок в заголовке, он отметит все остальные флажки в строках таблицы, как и ожидалось. locationJTable.getValueAt(x1, column.getModelIndex() показывает null при отладке во время попадания исключения.

Почему?

...