2009-03-17 14 views
13

He intentado esto:¿Cómo se eliminan las filas seleccionadas de una JTable?

public void removeSelectedFromTable(JTable from) 
{ 
    int[] rows = from.getSelectedRows(); 
    TableModel tm= from.getModel(); 

    while(rows.length>0) 
    { 
     ((DefaultTableModel)tm).removeRow(from.convertRowIndexToModel(rows[0])); 

     rows = from.getSelectedRows(); 
    } 
    from.clearSelection(); 
} 

Pero, a veces deja a uno sigue ahí. ¿Cual puede ser el problema?

+0

Esto no funcionó para mí –

Respuesta

1

¿Por qué no utilizar esto,

public void removeSelectedFromTable(JTable from) 
{ 
     int[] rows = from.getSelectedRows(); 
     TableModel tm = (DefaultTableModel) from.getModel(); 


     for (int row : rows) { 
      tm.removeRow(from.convertRowIndexToModel(row)); 
     } 

     from.clearSelection(); 
} 
+0

Esto funciona, y tiene en cuenta la tabla de clasificación, en su caso. – SingleShot

17

No funciona, esto es mejor:

public void removeSelectedRows(JTable table){ 
    DefaultTableModel model = (DefaultTableModel) this.table.getModel(); 
    int[] rows = table.getSelectedRows(); 
    for(int i=0;i<rows.length;i++){ 
    model.removeRow(rows[i]-i); 
    } 
} 
+1

Por lo tanto, restar i para contabilizar la diferencia de índice de las filas que ya se han eliminado, pero eso supone que las filas que se han eliminado ya están encima de la fila que "se va a eliminar". ¿Es siempre una suposición segura? –

+0

no lo es. 'para' debe ir de otra manera, con "i--" – Bugari

+0

Esto no tiene en cuenta la clasificación de la tabla. – SingleShot

-2

Miré a todas las soluciones, pero hay algunas excepciones, por lo que lo haría gustaría agregar esta respuesta.

for (int i = 0; i < raws.length; i++) { 
    System.out.println("I : " + i); 
    for (int j = 1; j <= 1; j++) { 
     defaultTableModel.removeRow(0); 
     jTStockJournal.clearSelection(); 
     defaultTableModel.fireTableDataChanged(); 
    } 
} 
+0

-1 para disparar eventos en nombre del modelo (es el trabajo del propio modelo) – kleopatra

8
int[] selectedRows = getTable().getSelectedRows(); 
     if (selectedRows.length > 0) { 
      for (int i = selectedRows.length - 1; i >= 0; i--) { 
       tableModel.removeRow(selectedRows[i]); 
      } 
     } 
5

Esto funcionó para mí

int numRows = table.getSelectedRows().length; 
for(int i=0; i<numRows ; i++) { 

    m_tableModel.removeRow(table.getSelectedRow()); 
} 
+0

¡Votado como este ** funciona perfectamente **! Porque _getSelectedRow() _ devuelve el índice de la primera fila seleccionada ... – trinity420

-2

Esta solución funciona con cabecera de clasificación y se actualiza automáticamente la tabla (es decir .: no es necesario para que rebuid).

El "Collecions.sort en orden inverso" permite evitar IndexOutOfBondException.

private void deleteSelectedRows() { 
     int[] selectedRows = table.getSelectedRows(); 
     table.clearSelection(); 

     // get model rows 
     List<Integer> selectedModelRows = new LinkedList<Integer>(); 
     for (int i =`enter code here` 0; i < selectedRows.length; i++) { 
      selectedModelRows.add(table.convertRowIndexToModel(selectedRows[i])); 
     } 

     Collections.sort(selectedModelRows, Collections.reverseOrder()); 

     for (int selectedModelRow : selectedModelRows) { 
      tableModel.removeRow(selectedModelRow); 
      tableModel.fireTableRowsDeleted(selectedModelRow, selectedModelRow); 
     } 
} 
+1

-1 para disparar eventos en nombre del modelo (es el trabajo propio del modelo) – kleopatra

0

¡Este código funciona para mí!

DefaultTableModel model = (DefaultTableModel) Table.getModel(); 
    int nbrrow=Table.getRowCount(); 

     if(nbrrow>=1){ 
      int[] rows = Table.getSelectedRows(); 
      if(rows.length>=1){ 
      if(Table.getModel().isCellEditable(Table.getSelectedRow(),Table.getSelectedColumn()) 
         &&Table.isEditing()==true) 
       { 
        Table.getCellEditor().stopCellEditing(); 
        for(int i=0;i<rows.length;i++){ 
        model.removeRow(rows[i]-i); 
        } 
       }else{ 
          for(int i=0;i<rows.length;i++){ 
          model.removeRow(rows[i]-i); 
          } 

       } 
      for(int i=0;i<Table.getRowCount();i++){ 
          model.setValueAt(i, i, 0); 
         } 
       Table.revalidate(); 
       Table.repaint(); 
      } 
     } 
0

Prueba este

public void removeSelectedFromTable(JTable table) { 

     DefaultTableModel model = (DefaultTableModel) table.getModel(); 
     int indexes[] = table.getSelectedRows(); 
     int res = 0; 
     for(int i = 0; i < indexes.length; i++) { 
      res += (i>0)?(indexes[i]-indexes[i-1]-1):0; 
      int index = table.convertRowIndexToModel(indexes[0]+res) 
      model.removeRow(index); 
     } 
    } 
0
int[] selectedRows = table.getSelectedRows(); 
List<Object> selectedObjects = new ArrayList<Object>(); 
for (int row : selectedRows) { 
    selectedObjects.add(tableModel.getObject(row)); 
} 
for (Object obj : selectedObjects) { 
    tableModel.removeObject(obj); 
} 

// Mi TableModel es una subclase de esta:

public abstract class ListTableModel<T> extends AbstractTableModel { 

    private List<T> data; 

    public void setData(List<T> data) { 
     this.data = data; 
    } 

    public T getObject(int row) { 
     return data.get(row); 
    } 

    @Override 
    public int getRowCount() { 
     return data.size(); 
    } 

} 
+0

DefaultTableModel no tiene el método "getObject" :( – barwnikk

+0

Y TableModel también ... – barwnikk

1
removeRows: { 
    int[] lines = t.getSelectedRows(); 
    if(lines.length==0) 
     break removeRows; 
    for(int i=0; i<lines.length; i++) { 
     lines[i]=t.convertRowIndexToModel(lines[i]); 
    } 
    Arrays.sort(lines); 
    for(int i=lines.length-1; i>=0; i--) { 
     dtm.removeRow(lines[i]);  
    } 
} 

Trabajar con la clasificación, columnas, selección múltiple, etc. movimiento

+0

¡El truco es ordenar las filas para eliminar y trabajar de abajo hacia arriba! –

0

Prueba esto:

int selectedIndex = table_.getSelectedRow(); 
while (selectedIndex >= 0) { 
    int modelIndex = table_.convertRowIndexToModel(selectedIndex); 
    tableModel_.removeRow(modelIndex); 

    selectedIndex = table_.getSelectedRow(); 
} 
-2

vacío jButton2ActionPerformed (java.awt.event.ActionEvent evt) {
privada DefaultTableModel defaultModel = (DefaultTableModel) jTable1.getModel(); Vector newRow = new Vector(); defaultModel.removeRow (jTable1.getSelectedRow()); i = i - 1; }

0

Está escrito para mí.introduzca el código aquí

public void removeSelectedFromTable(JTable from) 
    { 
     int[] rows = from.getSelectedRows(); 
     DefaultTableModel tm = (DefaultTableModel) from.getModel(); 
     for (int i = rows.length-1; i >= 0; i--) { 
      tm.removeRow(rows[i]); 
     } 
} 
0

El código siguiente funcionará: solución

do { 
    ((DefaultTableModel) jXTable1.getModel()).removeRow(jXTable1.getSelectedRows()[0]); 
} while (jXTable1.getSelectedRowCount() > 0); 
1

Java 8 de streaming:

IntStream.of(table.getSelectedRows()) 
      .boxed() 
      .sorted(Collections.reverseOrder()) 
      .forEach(model::removeRow); 

pestaña JTable;
Modelo DefaultTableModel;

0

que funciona para mí:

if(tablaNotif.getSelectedRows().length>0){ 
    int[] rows = tablaNotif.getSelectedRows(); 
    if(tablaNotif.getSelectedRows().length<2) { 
     modelo.remove(tablaNotif.convertRowIndexToModel(rows[0])); 
    } else{ 
     for(int i = 0; i<tablaNotif.getSelectedRows().length;i++) { 
      modelo.remove(tablaNotif.convertRowIndexToModel(rows[i])); 
     } 
     modelo.remove(tablaNotif.convertRowIndexToModel(rows[(tablaNotif.getSelectedRows().length-1)])); 
    } 
} 
Cuestiones relacionadas