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

#java #swing #jtable

#java #swing #jtable

Вопрос:

У меня есть табличная модель. Я хочу удалить строку из таблицы. Я не могу найти метод model.removeRow. Может кто-нибудь рассказать, как удалить строку? Ниже приведен код для модели.

 class TableModel extends AbstractTableModel {
private Object[][] data;
private String[] columnNames;

public TableModel(Object[][] data) {
    this.data = data;
    columnNames=new String[1];
    columnNames[0]="Data";
}

public int getRowCount() {
    return data.length;
}

public int getColumnCount() {
    return columnNames.length;
}

public Object getValueAt(int rowIndex, int columnIndex) {
    return data[rowIndex][columnIndex];
}

public Class getColumnClass(int c) {
    return String.class;
}

public boolean isCellEditable(int rowIndes, int columnIndex) {
    return false;
}

public String getColumnName(int index) {
    return columnNames[index];
}

public void setValueAt(Object value, int rowIndex, int columnIndex) {
    data[rowIndex][columnIndex] = value;
    fireTableCellUpdated(rowIndex, columnIndex);
}
  

}

Ответ №1:

Используйте DefaultTableModel . У него есть public void removeRow(int row) метод.

Комментарии:

1. @Kaushik Balasubramanain public boolean isCellEditable(int rowIndes, int columnIndex) { 1

2. Привет, как удалить выбранную строку jtable, которая считывает данные из файла?

Ответ №2:

должно быть, вам не хватает чего-то очевидного в модели по умолчанию, возможно, вы неправильно переопределяете mot, если делаете свою собственную, и вы можете подумать, что этого не хватает :

 DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);

// Create some data
model.addColumn("Col1");
model.addRow(new Object[]{"r1"});
model.addRow(new Object[]{"r2"});
model.addRow(new Object[]{"r3"});

// Remove the first row
model.removeRow(0);

// Remove the last row
model.removeRow(model.getRowCount()-1);
  

Ответ №3:

DefaultTableModel — это одно из решений. Но если вы все еще хотите использовать абстрактную табличную модель, вот как вы это делаете.

Это новое определение модели.

 class TableModel extends AbstractTableModel {

private Object[][] data;
private String[] columnNames;

public TableModel(Object[][] data) {
    this.data = data;
    columnNames=new String[1];
    columnNames[0]="Data";
}

public int getRowCount() {
    return data.length;
}

public int getColumnCount() {
    return columnNames.length;
}

public Object getValueAt(int rowIndex, int columnIndex) {
    return data[rowIndex][columnIndex];
}

public Class getColumnClass(int c) {
    return String.class;
}

public boolean isCellEditable(int rowIndes, int columnIndex) {
    return false;
}

public String getColumnName(int index) {
    return columnNames[index];
}

public void removeRow(int row)
{
    Object [][]newData=new Object[data.length-1][data[0].length];
    for(int i=0;i<newData.length;i  ){
        for(int j=0;j<data[0].length;j  ){
            newData[i][j]=data[i 1][j];
        }
    }
    data=new Object[newData.length][columnNames.length];
    data=newData;
    fireTableRowsDeleted(row, row);
}


public void setValueAt(Object value, int rowIndex, int columnIndex) {
    data[rowIndex][columnIndex] = value;
    fireTableCellUpdated(rowIndex, columnIndex);
}
  

}

Сначала вам нужно удалить данные строки из объекта данных. а затем удалите строку.

Комментарии:

1. это не так, вы можете int modelRow = convertRowIndexToModel(row); из TableView, не используйте AbstractTableModel, методы, которые вы показали здесь, включены в DefaultTableModel по умолчанию, сообщение @StanislavL является правильным в качестве ответа

2. способ удаления выглядит подозрительно (не пробовал, довольно странно использовать массив в качестве структуры данных, если вы хотите поддерживать модификации, лучше используйте что-то изменяемое, например, список списков, например): параметр row не используется при манипулировании массивом, что приводит к а) всегда удалению последней строки б) некорректному событию уведомления (всегда неверно, за исключением случаев, когда случайно row == getRowCount() - 1 )

3. @mKorbel не вижу, как здесь где-либо вступает в действие метод таблицы , мы полностью находимся в области модели

Ответ №4:

Каушик, если ты действительно хочешь создать свою собственную реализацию интерфейса TableModel и разобраться с хранением строк вручную (как ты, очевидно, делаешь, используя Object[][] data ), то ты должен реализовать removeRow() метод, потому что абстрактная табличная модель «не знает», как это сделать. removeRow() должен будет запустить функцию removerowsdeleted() в конце…

Хорошей альтернативой является рефакторинг вашего класса и расширение им DefaultTableModel.

Еще одно предложение — поскольку модель таблицы сильно меняется, динамический массив может быть плохим выбором для хранения, потому что вам нужно либо перераспределять пространство каждый раз, когда вы добавляете строку (плохо), либо вы предварительно выделяете достаточно места для определенного количества строк, а затем всякий раз, когда места недостаточно, вы выделяете new Object[][] с некоторым дополнительным пространством (для следующих N строк). Обычно люди выделяют достаточно места для 2 ^ n строк в процессе перераспределения.