2016-06-21 14 views
2

私はTableModel(私のすべてのデータ)を含むJTableを持っています。 JTableには複数の行と列があります。私はランダムに行をシャッフルする必要があります。私はJtableでシャッフルする方法

Collections.shuffle(some list from TableModel); 

であることを行うことができます理解しかし、私はのTableModelを持っていた既存のJTableからリストを取得する方法を知りません。 somebodies提案に

、私はこの

RowSorter<? extends TableModel> sorter = mDocListTable.getRowSorter(); 
    ArrayList<RowSorter.SortKey> list = new ArrayList<RowSorter.SortKey>(); 

    list.add(new RowSorter.SortKey(0, SortOrder.DESCENDING)); 

    Collections.shuffle(list); 
    sorter.setSortKeys(list); 

が、didntの仕事を試してみました。

+1

カスタム['RowSorter'](https://docs.oracle.com/javase/7/docs/api/javax/swing/RowSorter.html)を作成する方法があると思います。 'RowSorter'は列ヘッダーをソートキーとして使用する目的で設計されているので、必ずしも必要ではないオーバーヘッドがありますが、' convertRowIndexToModel(int index) 'メソッドと' convertRowIndexToView(int index) 'メソッドは、あなたがしたいことをしなさい。単純に、整数リスト '[0、1、...、getRowCount()]'を同じ整数にマッピングして作成しましたが、シャッフルされました。ビュー変換メソッドは、マップされた値を返します。 – Ironcache

+0

実際にモデルのテーブルを(ビューだけでなく)変更したいのであれば、[DefaultTableModel'](https:// docs。)で 'moveRow(int start、int end、int to)'を使うこともできます。 oracle.com/javase/7/docs/api/javax/swing/table/DefaultTableModel.html)。 – Ironcache

+0

"単純に整数のリスト[0,1、...、getRowCount()]のマッピングを同じ整数に作成してシャッフルしてみてください"小さな例が役に立ちます – user1631306

答えて

2

このような機能はありますか?

DefaultTableModel model = (DefaultTableModel) table.getModel(); 
model.getDataVector().sort((Object o1, Object o2) -> Math.random() > 0.5 ? -1 : 1); 
model.fireTableDataChanged(); 

編集:Java-7については

.sort()Java-8まで実装されていなかったことから、第二(そしておそらくより読みやすい)オプションは、次のようになります。

DefaultTableModel model = (DefaultTableModel) table.getModel(); 
Collections.shuffle(model.getDataVector()); 
model.fireTableDataChanged(); 

これを元に戻すことはできません。

+0

これは私の答えよりも優れています。私は私の答えを削除し、代わりにこれをお勧めします。 – Ironcache

+0

これには、ラムダ式(IE:Java 8)をサポートするJavaのバージョンが必要ですが、注意してください。 – Ironcache

+0

オブジェクトo1、オブジェクトo2 – user1631306

関連する問題