2009-03-17 25 views
13

Ho provato questo:Come rimuovi le righe selezionate da una tabella J?

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

Ma, a volte lascia un ancora lì. Quale può essere il problema?

+0

Questo non ha funzionato per me –

risposta

1

Perché non utilizzare questo,

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

Questo funziona, e tiene conto tavolo di cernita, se del caso. – SingleShot

17

Non funziona, questo è meglio:

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

Quindi si sottrae i per tenere conto della differenza di indice dalle righe che sono già state rimosse, ma questo presuppone che le righe che sono state rimosse già siano sopra la riga che sta per essere "rimossa". È sempre un'assunzione sicura? –

+0

non lo è. 'for' dovrebbe andare in un altro modo, con "i--" – Bugari

+0

Questo non tiene conto dell'ordinamento delle tabelle. – SingleShot

-2

ho guardato tutte le soluzioni, ma ci sono alcune eccezioni, quindi vorrei piace aggiungere questa risposta.

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 per gli eventi di fuoco per conto del modello (è il lavoro del modello stesso) – kleopatra

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

questo ha lavorato per me

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

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

Votato come questo ** funziona perfettamente **! Perché _getSelectedRow() _ restituisce l'indice della prima riga selezionata ... – trinity420

-2

Questa soluzione funziona con l'intestazione di ordinamento e gli aggiornamenti automaticamente la tabella (cioè .: non è tenuto a rebuid esso).

"Collecions.sort in ordine inverso" consente di evitare 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 per gli eventi di attivazione per conto del modello (è il lavoro del modello stesso) – kleopatra

0

Questo codice funziona per me!

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

Prova questa

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

// mio TableModel è una sottoclasse di questo:

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 non ha metodo "getObject" :( – barwnikk

+0

E anche TableModel ... – 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]);  
    } 
} 

Lavorare con l'ordinamento, colonne, selezione multipla, ecc in movimento

+0

Il trucco è ordinare le righe da rimuovere e lavorare dal basso verso l'alto! –

0

Prova questo:

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

    selectedIndex = table_.getSelectedRow(); 
} 
-2

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

0

Si è svegliato per me.inserire il codice qui

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

Il codice di seguito funzionerà: soluzione

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

Java 8 streaming:

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

scheda JTable;
Modello DefaultTableModel;

0

che funziona per me:

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)])); 
    } 
} 
Problemi correlati