Подтвердить что ты не робот

Как удалить строку из JTable?

Я хочу удалить некоторые строки из JTable. Как я могу это сделать?

4b9b3361

Ответ 1

Чтобы удалить строку из JTable, вам нужно удалить целевую строку из базового TableModel. Если, например, ваш TableModel является экземпляром DefaultTableModel, вы можете удалить строку, выполнив следующие действия:

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove);

Ответ 2

Если вам нужно простое рабочее решение, попробуйте использовать DefaultTableModel.

Если вы создали свою собственную модель таблицы, которая расширяет AbstractTableModel, тогда вы также должны реализовать метод removeRow(). Точная реализация зависит от базовой структуры, которую вы использовали для хранения данных.

Например, если вы использовали Vector, это может быть примерно так:

public class SimpleTableModel extends AbstractTableModel {
    private Vector<String> columnNames = new Vector<String>();
    // Each value in the vector is a row; String[] - row data;
    private Vector<String[]> data = new Vector<String[]>();

    ...

    public String getValueAt(int row, int col) {
        return data.get(row)[col];
    }

    ...

    public void removeRow(int row) {
        data.removeElementAt(row);
    }
}

Если вы использовали List, это было бы очень похоже:

// Each item in the list is a row; String[] - row data;
List<String[]> arr = new ArrayList<String[]>();

public void removeRow(int row) {
    data.remove(row);
}

HashMap:

//Integer - row number; String[] - row data;
HashMap<Integer, String[]> data = new HashMap<Integer, String[]>();

public void removeRow(Integer row) {
    data.remove(row);
}

И если вы используете такие массивы, как этот

String[][] data = { { "a", "b" }, { "c", "d" } };

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

Чтобы лучше понять, как это работает и что нужно сделать, чтобы ваша собственная модель работала правильно, я strong посоветую вам обратиться к Учебник по Java, DefaultTableModel API и исходный код.

Ответ 3

Правильный способ применения фильтра к JTable состоит из RowFilter интерфейса, добавленного в TableRowSorter. Используя этот интерфейс, представление модели можно изменить без изменения базовой модели. Эта стратегия сохраняет парадигму Model-View-Controller, тогда как удаление строк, которые вы хотите скрывать от самой модели, нарушает парадигму, смешивая ваше разделение проблем.

Ответ 4

JTable обычно формирует часть представления реализации MVC. Вы захотите удалить строки из своей модели. JTable, который должен прослушивать эти изменения, будет обновляться, чтобы отразить это удаление. Следовательно, вы не найдете removeRow() или аналогичный метод JTable.

Ответ 5

Посмотрите на DefaultTableModel для простой модели, которую вы можете использовать:

http://java.sun.com/javase/6/docs/api/javax/swing/table/DefaultTableModel.html

Это расширяет AbstractTableModel, но этого должно быть достаточно для основных целей. Вы всегда можете расширить AbstractTableModel и создать свой собственный. Убедитесь, что вы также установили его на JTable.

http://java.sun.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

Посмотрите на основной учебник Sun для получения дополнительной информации об использовании JTable с табличной моделью:

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

Ответ 6

mmm - очень простые парни

for( int i = model.getRowCount() - 1; i >= 0; i-- )
{
    model.removeRow(i);
}