2010-11-25 16 views
1

私はjtableスイングを使用しています。私のjtableの中にチェックボックスがありますが、チェックされたチェックボックスのみを削除する最も良い方法は何ですか?jTableチェックボックスと行を削除する

私はdefaultTableModelとremoveRowを使用していますが、私はtickedチェックボックスのTRUE値を取得する方法を知る必要があります。

+0

お持ちの場合NPEのコードが間違っているか、テーブルモデルのデータが不良です。問題を示すSSCCE(http://sscce.org)を投稿してください。 – camickr

+0

khachikメソッドを使用している場合にのみNPEがあります。 – SOer

答えて

2

JCheckBoxをセルエディタに設定すると、その値を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);'キャスト時に '(ブール型)tableModel.getValueAt..'があり、NULLポインタエラー – SOer

+0

がありますカスタムエディタを設定する必要はありません。 getColumnClass(..)メソッドをオーバーライドしてBooleanを列クラスとして返すと、テーブルは適切なレンダラーとエディターを使用します。また、行を削除するときは、表の最後から開始してカウントダウンする必要があります。そのため、行をスキップして削除しないでください。 – camickr

+0

@ SOerキャスティング固定、ありがとう。操作上の 'NullPointerException'? – khachik

2

あなたは「すべての選択を削除」を実装する必要がある場合は、(より良いユーザー体験を与えることができる)いくつかの再描画を節約すること、次のTableModel拡張を検討してください。

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

} 
} 
関連する問題