Сохранить выбранные строки JTable и показать их в другом JTable (в другом JFrame) - PullRequest
0 голосов
/ 06 мая 2019

У меня есть таблица с некоторыми данными. Я хочу выбрать пару строк, которые я хочу отслеживать (затем я отобразлю эти строки в новой JFrame со своей собственной таблицей) - давайте назовем эти отслеживаемые записи.

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

Например, в моей исходной таблице 10 строк, я выбираю 3, в новой таблице будет всего 10 строк, но только 8, 9 и 10 заполнены выбранными данными, а строки 1-7 просто содержат пустые ячейки.

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

public void exportSelectedRows(ActionEvent actionEvent) {
        TableModel tableModel = patientTable.getModel();
        int[] index = patientTable.getSelectedRows();
        Object[] row = new Object[10]; //problem is here that object has size 10 hence the 10 rows?
        monitoredPatients = new MonitoredPatients();
        monitoredPatients.monitoredPatientsTable = new JTable(row.length, columnNames.length);
        DefaultTableModel defaultTableModel = (DefaultTableModel) monitoredPatients.monitoredPatientsTable.getModel();
        for (int value : index) {
            row[0] = tableModel.getValueAt(value, 0);
            row[1] = tableModel.getValueAt(value, 1);
            row[2] = tableModel.getValueAt(value, 2);
            row[3] = tableModel.getValueAt(value, 3);
            row[4] = tableModel.getValueAt(value, 4);
            row[5] = tableModel.getValueAt(value, 5);
            defaultTableModel.addRow(row);
        }
        monitoredPatients.add(new JScrollPane(monitoredPatients.monitoredPatientsTable));
    }

Я ожидаю, что в новой таблице будут отображаться только выбранные записи без пустых строк.

1 Ответ

0 голосов
/ 07 мая 2019

row = new Object [10]; // проблема здесь в том, что объект имеет размер 10, следовательно, 10 строк? .. monitoredPatients.monitoredPatientsTable = new JTable (row.length, columnNames.length);

Ну, у вас есть пара проблем:

  1. Зачем вам создавать массив строк со значением 10? Массив строк представляет данные для каждой строки. Вы копируете только 6 столбцов данных, поэтому размер массива должен быть только 6.

  2. Значение для числа строк должно быть 0, так как вы начинаете с пустой DefaulotTableModel. Затем вы используете метод addRow(...) для добавления новой строки данных. Это делает размер вашей TableModel динамическим.

Таким образом, код должен быть:

monitoredPatients.monitoredPatientsTable = new JTable(0, columnNames.length);

Или еще лучше, почему бы вам не создать TableModel с массивом, содержащим имя столбцов? Я уверен, что вы не хотите видеть «A, B, C, D, E, F», которое будет по умолчанию, если вы просто укажите количество столбцов. Прочтите API DefaultTableModel, чтобы использовать соответствующий конструктор.

...