2009-03-17 5 views
13

Я попытался это:Как удалить выбранные строки из 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(); 
} 

Но, иногда оставляет один до сих пор там. В чем проблема?

+0

Это не работает для меня –

ответ

1

Почему бы не использовать это,

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

Это работает, и принимает во сортировку счета таблицы, если таковые имеются. – SingleShot

17

Это не работает, это лучше:

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

Итак, вы вычитаете i для учета разницы индексов из строк, которые уже были удалены, но предполагает, что уже удаленные строки уже превышают строку, которая «должна быть» удалена. Это всегда безопасное предположение? –

+0

это не так. «for» должен идти другим путем, с «i--» – Bugari

+0

Это не учет сортировки таблицы. – SingleShot

-2

Я смотрел на все решения, но есть некоторые исключения, так что я бы хотел бы добавить этот ответ.

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 для запуска мероприятий от имени модели (это собственная работа модели) – kleopatra

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

Это работало для меня

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

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

Проголосовали за это ** отлично работает **! Поскольку _getSelectedRow() _ возвращает индекс первой выбранной строки ... – trinity420

-2

Это решение работает с заголовком сортировки и обновления автоматически таблицы (т.е .: не требуется, чтобы rebuid его).

«Collecions.sort в обратном порядке» позволяет избежать исключения 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 для запуска событий от имени модели (это собственное задание модели) – kleopatra

0

Этот код работает для меня!

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

Попробуйте

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

// Мой TableModel подкласс этого:

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 не имеет метода «getObject» :( – barwnikk

+0

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

Работа с сортировкой, перемещение столбцов, множественный выбор, и т.д. .

+0

Хитрость заключается в сортировке строк для удаления и работы снизу вверх! –

0

Попробуйте это:

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

    selectedIndex = table_.getSelectedRow(); 
} 
-2

частная пустота jButton2ActionPerformed (java.awt.event.ActionEvent ЭВТ) {
DefaultTableModel defaultModel = (DefaultTableModel) jTable1.getModel(); Vector newRow = new Vector(); defaultModel.removeRow (jTable1.getSelectedRow()); i = i - 1; }

0

Это копченое для меня.введите код здесь

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

ниже код будет работать:

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

Java 8 потокового решение:

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

вкладка JTable;
Модель модели DefaultTableModel;

0

Это работает для меня:

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)])); 
    } 
} 
Смежные вопросы