2009-10-08 10 views
9

プログラムでJTableを並べ替える方法はありますか?JTableをプログラムで並べ替える

ユーザが任意の列を押したときにテーブルがソートされるように、JTableのソートが(setRowSorterを使用して)動作しています。

I知っている、などSWingX JXTableはおそらく動作しますが、他のすべてはかなり今働いているので、私はむしろ面倒を通過しないだろうと私はNetBeansのビジュアルエディタがJXTableをどのように処理するかをよく知っていない

編集:選択された回答は、Sunのページからの回答が私にとってはうまくいかなかったという私の(今削除された)声明を参照しています。それは私の無知によって引き起こされた環境問題でした。私にとって

+0

あなたが試したコードを投稿することはできますか? – akf

+0

http://www.exampledepot.com/egs/javax.swing.table/Sorter.html –

+0

JXTableをNetBeans 6.7に簡単に追加できました。そのため、オプションとしてそれを除外しないでください。メインプロジェクトで試してみる前に、小さなテストプロジェクトを試してみてください。 – ssakl

答えて

14

作品罰金:何かがうまくいかないとき

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableBasic extends JFrame 
{ 
    public TableBasic() 
    { 
     String[] columnNames = {"Date", "String", "Long", "Boolean"}; 
     Object[][] data = 
     { 
      {new Date(), "A", new Long(1), Boolean.TRUE }, 
      {new Date(), "B", new Long(2), Boolean.FALSE}, 
      {new Date(), "C", new Long(9), Boolean.TRUE }, 
      {new Date(), "D", new Long(4), Boolean.FALSE} 
     }; 

     final JTable table = new JTable(data, columnNames) 
     { 
      // Returning the Class of each column will allow different 
      // renderers and editors to be used based on Class 

      public Class getColumnClass(int column) 
      { 
       // Lookup first non-null data on column 
       for (int row = 0; row < getRowCount(); row++) 
       { 
        Object o = getValueAt(row, column); 

        if (o != null) 
         return o.getClass(); 
       } 

       return Object.class; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     table.setAutoCreateRowSorter(true); 
     // DefaultRowSorter has the sort() method 
     DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter()); 
     ArrayList list = new ArrayList(); 
     list.add(new RowSorter.SortKey(2, SortOrder.ASCENDING)); 
     sorter.setSortKeys(list); 
     sorter.sort(); 

     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) 
    { 
     TableBasic frame = new TableBasic(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

次回はあなたのSSCCEを投稿してください。

+0

あなたは正しいですが、自分の環境に問題があり、Java側から最新のクラスを使用していませんでした(私は半分のClojure /半分のJavaプロジェクトをやっています)。 – auramo

+0

リストを作成するのが怠惰な場合は、 'Collections.singletonList(新しいRowSorter.SortKey(2、SortOrder.ASCENDING))'を使用してください。 – Matthieu

4

また、あなたのJTableRowSortertoggleSortOrder()を呼び出すことによってソート行をトリガすることができます

table.getRowSorter().toggleSortOrder(columnIndex); 

はただし、(Javadocを引用):

はのソート順序を逆にします指定された列。通常、指定した列がすでにソートされている最初の列であれば、ソート順が昇順から降順(または降順から昇順)に戻ります。

それが迅速ですが、@camickr(彼に1)で示されるようにsetSortKeys()を呼び出して行くための正しい方法である(ただし、Listをインスタンス化する必要があります)。

関連する問題