Удалить строку из JTable - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть настольная модель.Я хочу удалить строку из таблицы.Я не могу найти метод 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);
}

}

Ответы [ 4 ]

4 голосов
/ 09 ноября 2011

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

2 голосов
/ 09 ноября 2011

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

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

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);
}

}

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

2 голосов
/ 09 ноября 2011

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

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);
1 голос
/ 09 ноября 2011

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

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

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

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