2010-11-25 5 views
1

J'utilise jtable swing, il ya checkbox à l'intérieur jtable de la mienne, quelle serait la meilleure façon de supprimerRow de checkbox seulement? J'utilise defaultTableModel et removeRow, j'ai besoin de savoir comment obtenir la valeur TRUE de case à cocher cochée.jTable case à cocher et suppression de ligne

+0

Si vous avez un NPE alors soit votre code est faux ou les données dans le modèle de table sont mauvaises. Publiez votre SSCCE (http://sscce.org) démontrant le problème. – camickr

+0

il n'y a NPE que si j'utilise la méthode khachik – SOer

Répondre

2

Lorsque vous définissez un JCheckBox sur l'éditeur de cellules, vous pouvez en lire la valeur sous la forme Boolean.

class TableModel extends DefaultTableModel { 

    public TableModel(Object[] headers) { 
    super(null, headers); 
    } 

    public Class getColumnClass(int c) { 
    switch (c) { 
     case 0: return Boolean.class; 
     default: return String.class; 
    } 
    } 

    public boolean isCellEditable(int row, int column) { 
    if (column == 0) return true; 
    return false; 
    } 
} 

TableModel tableModel = new TableModel(<headers as String []>); 
JTable table = new JTable(tableModel); 
.... 

TableColumnModel columnModel = table.getColumnModel(); 
// setting the first column to use checkboxes 
columnModel.getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox())); 
... 

int rowCount = tableModel.getRowCount(); 
for(int i=0; i<rowCount; i++) { 
    Boolean selected = (Boolean)tableModel.getValueAt(0, 0); 
    if(selected) { 
    tableModel.removeRow(0); 
    } 
} 
+0

'Boolean selected = tableModel.getValueAt (i, 0);' type non compatible, lors de la fusion '(Boolean) tableModel.getValueAt..', il y a une erreur de pointeur nul – SOer

+0

Il y a pas besoin de définir un éditeur personnalisé. Remplacez la méthode getColumnClass (..) pour renvoyer Boolean en tant que classe de colonne et la table utilisera le moteur de rendu et l'éditeur appropriés. De même, lorsque vous supprimez des lignes, vous devez commencer à partir de la fin de la table et compter à rebours afin de ne pas ignorer les lignes lorsque vous les supprimez. – camickr

+0

@SOer coulée fixe, merci. 'NullPointerException' sur quelle opération? – khachik

2

Si vous avez besoin de mettre en œuvre la « Supprimer tous les éléments sélectionnés » vous pouvez envisager l'extension TableModel suivante, qui sauvera des repeints (ce qui peut donner une meilleure expérience utilisateur):

import javax.swing.table.DefaultTableModel; 

public class RemoveCheckedRowsTableModel extends DefaultTableModel { 

public void removeCheckedRows(int removeCheckBoxColumn) { 
    int beginRow = 0; 
    int endRow = 0; 

RangeSearch: while (beginRow < dataVector.size()) { 
    while (getValueAt(beginRow, removeCheckBoxColumn).equals(Boolean.FALSE)) { 
     beginRow++; 
     endRow++; 
     if (beginRow >= dataVector.size()) { 
      break RangeSearch; 
     } 
    } 
    while ((endRow + 1) < dataVector.size() 
      && getValueAt((endRow + 1), removeCheckBoxColumn).equals(Boolean.TRUE)) { 
     endRow++; 
    } 
    for (int i = beginRow; i <= endRow; i++) { 
     dataVector.removeElementAt(beginRow); 
    } 
    fireTableRowsDeleted(beginRow, endRow); 
    endRow = ++beginRow; 
    } 

} 
}