2009-07-13 9 views
14

JTableからいくつかの行を削除します。どうしたらいいですか?JTableから行を削除するには?

+6

ヒントです:あなたは何をすでに試行しましたが、何を読んだ上で、オンラインチュートリアルを説明するならば、人々はあなたを助けるために、より傾斜になります。あるいは、いくつかのサンプルコードを与えて、動作しないビットを教えてください。まだ読んでいない場合は、こちらをご覧ください: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html –

答えて

3

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

+0

助けを借りて、私は行を削除する方法を知りたいテーブルモデル、何もメソッドを取得していない。 –

+1

次のようなものを読んでください。http://java.sun.com/docs/books/tutorial/uiswing/components/table.html – dave

+0

要するに、カスタムTableModelを作成します。 JTableは行を格納せず、それをTableModelに委譲します。必要に応じて、AbstractTableModelからサブクラス化することができます。行を削除するたびにfireTableRowsDeleted()を呼び出します。ヘルプのために – dave

3

ルック:

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の使用方法の詳細についての基本的な日のチュートリアルを見てみましょう。JTableのから行を除去するために

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

33

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

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove); 
+0

がありましたが、私はこの方法を使用していて動作していません。実際に私のJTableはLocationTableモデル(独自に作成)を使用しているので、removeRow(i)メソッドを使用しているときに "cant resolve removeRow()"というエラーが発生しています。 –

+4

独自のカスタムTableModelを作成した場合、独自の「removeRow」メソッドを作成する必要があります。 DefaultTableModelのソースコードを見て、これがどのように行われているかを見てください。簡単な解決策は、DefaultTableModelを使用することです。なぜカスタムTableModelを作成する必要があると思いますか?モデルの使用の基本を理解するまで、提供されるデフォルトを使用します。 – camickr

4

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

8

簡単な解決策が必要な場合は、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); 
} 

そして、あなたはこの1

ような配列を使用している場合、
String[][] data = { { "a", "b" }, { "c", "d" } }; 

これで、配列から要素を動的に削除する方法がないため、あなたは不運になります。あなたは、削除された行とそうでない行を通知するいくつかのフラグを別々に格納することで配列を使用しようとするかもしれませんが、それに対して助言します...それは不必要な複雑さをもたらし、実際には別のを作成して問題を解決してください。それはhereに終わる確実な方法です。上記の方法のいずれかを試して、代わりにテーブルデータを保存してください。これがどのように動作するかをより良く理解するために

、そしてどのような適切独自のモデルを動作させるために行うには、私は強くは、Java Tutorialを参照するためにあなたをアドバイスDefaultTableModel API、それはsource code

3

MMMは非常に単純な男

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

午前中に何百万もの通知はありません;-) – greenoldman

関連する問題