JTable дублирует столбцы при «скрытии» и «отображении» их - PullRequest
2 голосов
/ 26 мая 2020

В настоящее время я использую JTable для отображения некоторых сведений о пациенте. У меня есть JCheckBox, который при включении добавляет новый столбец в таблицу и добавляет данные в новый столбец. Когда он не отмечен, он должен удалить столбец, вроде как добавление дополнительных фильтров в таблицу. Однако, когда я снова устанавливаю флажок после его снятия, столбцы в таблице дублируются.

Я пытался использовать метод fireTableStructureChanged (), но он никогда не обновлял таблицу, поэтому столбцы остаются там, даже если флажок не установлен. Но если я удалю его, то, когда я сниму флажок, он работает, но тогда проблема дублирования возвращается. Я вставил свой метод actionPerformed (), когда установлен флажок. Первое изображение моей таблицы, прежде чем я нажму свой флажок. Второй - когда я нажимаю флажок, и столбец добавляется. Наконец, третий - когда я снимаю флажок и снова ставлю галочку. Мы будем очень благодарны за любую помощь.

 @Override
        public void actionPerformed(ActionEvent e)
        {
            if (gui.getChkCholesterol().isSelected() == true)
            {
                try {
                    gui.getRightTableModel().addColumn("Cholesterol");
                    newColumnIndeces.put("2093-3",gui.getRightTable().getColumnCount()-1);
                    gui.getRightTableModel().addColumn("Cholesterol Effective Date/Time");
                    newColumnIndeces.put("2093-3e",gui.getRightTable().getColumnCount()-1);
                    if(gui.getRightTable().getRowCount()>0)
                    {
                        int columnNumberValue = newColumnIndeces.get("2093-3");
                        int columnNumberDate = newColumnIndeces.get("2093-3e");
                        for (int i = 0; i<gui.getRightTable().getRowCount(); i++)
                        {
                            String value = op.getPatientObservationValue(gui.getRightTable().getValueAt(i,0).toString(),"2093-3");
                            String date = op.getPatientObservationEffectiveDate(gui.getRightTable().getValueAt(i,0).toString(),"2093-3");
                            gui.getRightTableModel().setValueAt(value, i, columnNumberValue);
                            gui.getRightTableModel().setValueAt(date, i, columnNumberDate);
                        }
                    }
                } catch (ParseException parseException) {
                    parseException.printStackTrace();
                }

                setCellColourForTable();

                timer.schedule(new RefreshTable(), 0, seconds);
            }

            else
            {
                gui.getRightTable().removeColumn(gui.getRightTable().getColumnModel().getColumn(newColumnIndeces.get("2093-3")));
                gui.getRightTable().removeColumn(gui.getRightTable().getColumnModel().getColumn(newColumnIndeces.get("2093-3e")-1));
                newColumnIndeces.remove("2093-3");
                newColumnIndeces.remove("2093-3e");

                timer.cancel();
                timer = new Timer();
            }
            gui.getRightTableModel().fireTableStructureChanged();
        }

Image 1

Image 2

enter image description here

1 Ответ

0 голосов
/ 26 мая 2020

Вы добавляете столбец в модель, используя:

gui.getRightTableModel().addColumn("Cholesterol");

Это уведомит представление об изменении данных, и таблица также будет обновлена.

Однако вы удалите столбец из таблицы, используя:

 gui.getRightTable().removeColumn(…);

Это только удаляет столбец из «представления таблицы». Столбец не был удален из DefaultTableModel. Поэтому в следующий раз, когда вы добавите столбец, он просто добавится в конец DefaultTableModel.

Таким образом, решение состоит в том, чтобы удалить столбец из DefaultTableModel, а не из таблицы.

К сожалению, не существует метода removeColumn(…).

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

model.setColumnCount(model.getColumnCount() - 2);

, который будет эффективно удалить последние два столбца из модели.

Другой вариант - не добавлять столбцы в DefaultTableModel, а вместо этого вы можете просто добавить / удалить TableColumns из TableColumnModel напрямую. Таким образом, это будет означать, что данные для столбца Cholestoral всегда будут в модели, но представление просто не будет отображать столбцы.

Поэтому вместо использования model.addColumn(…) вы должны использовать метод table.addColumn(…).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...