web-dev-qa-db-ja.com

JTableから行を削除する方法は?

JTableからいくつかの行を削除したい。どうすればできますか?

16
somya agrawal

JTableから行を削除するには、基になる TableModel からターゲット行を削除する必要があります。たとえば、TableModelが DefaultTableModel のインスタンスである場合、次のようにして行を削除できます。

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove);
36

単純な作業ソリューションが必要な場合は、 DefaultTableModel を使用してみてください。

AbstractTableModelを拡張する独自のテーブルモデルを作成した場合は、removeRow()メソッドも実装する必要があります。正確な実装は、データを格納するために使用した基になる構造によって異なります。

たとえば、ベクターを使用している場合は、次のようになります。

public class SimpleTableModel extends AbstractTableModel {
    private Vector<String> columnNames = new Vector<String>();
    // Each value in the vector is a row; String[] - row data;
    private Vector<String[]> data = new Vector<String[]>();

    ...

    public String getValueAt(int row, int col) {
        return data.get(row)[col];
    }

    ...

    public void removeRow(int row) {
        data.removeElementAt(row);
    }
}

リストを使用した場合、それは非常に似ています。

// Each item in the list is a row; String[] - row data;
List<String[]> arr = new ArrayList<String[]>();

public void removeRow(int row) {
    data.remove(row);
}

HashMap:

//Integer - row number; String[] - row data;
HashMap<Integer, String[]> data = new HashMap<Integer, String[]>();

public void removeRow(Integer row) {
    data.remove(row);
}

そして、このような配列を使用している場合

String[][] data = { { "a", "b" }, { "c", "d" } };

その後、配列から要素を動的に削除する方法がないため、運が悪くなります。どの行が削除され、どの行が削除されないかを通知するいくつかのフラグを個別に保存するか、他の不正な方法で配列を使用しようとするかもしれませんが、私はそれをお勧めしません... 別の問題を作成して問題を解決する。これは、最終的に here になる確実な方法です。代わりに、上記の方法のいずれかを試して、テーブルデータを保存してください。

これがどのように機能するか、および独自のモデルを適切に機能させるために何をすべきかについての理解を深めるために、私は 強く JavaチュートリアルDefaultTableModel API を参照することをお勧めします ソースコード です。

8
Kirill Strizhak

JTableにフィルターを適用する正しい方法は、TableRowSorterに追加された RowFilter インターフェースを使用することです。このインターフェイスを使用すると、基になるモデルを変更せずにモデルのビューを変更できます。この戦略はモデル-ビュー-コントローラーパラダイムを維持しますが、モデル自体から非表示にしたい行を削除すると、懸念の分離が混乱してパラダイムが破られます。

4
codethulhu

JTableは通常、MVC実装のビュー部分を形成します。モデルから行を削除する必要があります。これらの変更をリッスンするJTableは、この削除を反映して更新されます。したがって、JTableのメソッドとしてremoveRow()などは見つかりません。

3
dave

mmmは非常に単純な人です

for( int i = model.getRowCount() - 1; i >= 0; i-- )
{
    model.removeRow(i);
}
3
cmujica

DefaultTableModelを見て、使用できる単純なモデルを探します。

http://Java.Sun.com/javase/6/docs/api/javax/swing/table/DefaultTableModel.html

これはAbstractTableModelを拡張しますが、基本的な目的には十分です。いつでもAbstractTableModelを拡張して独自のものを作成できます。 JTableでも設定してください。

http://Java.Sun.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

テーブルモデルでJTableを使用する方法の詳細については、Sunの基本的なチュートリアルを参照してください。

http://Java.Sun.com/docs/books/tutorial/uiswing/components/table.html#data

3
Jon