2010-12-29 10 views
0

私はJTableを持っており、並べ替えが追加されています。現在、JTableには5つの列があり、2番目の列は日付フィールドにDD/MM/YYYYに変換され、セルのJTextFieldに表示されます。JTable +特定のフィールドの並べ替え

ソートすると文字列としてソートされ、日付が混ざり合うと、その特定の列のソート動作をどのように変更できますか?

例えば、 ASC順にソートした後、私はこれを取得:間違っている、と私は

List<SortKey> sortKeys = new ArrayList<SortKey>(); 
sortKeys.add(new SortKey(2, SortOrder.ASCENDING)); 
table.getRowSorter().setSortKeys(sortKeys); 
をソートするため

01/03/2011 
01/04/2011 
01/05/2011 
01/06/2011 
01/07/2011 
01/08/2011 
01/09/2011 
01/10/2011 
01/12/2011 
01/02/2012 
私のコードは次のようになります

のような結果を得るべきである

01/02/2012 
01/03/2011 
01/04/2011 
01/05/2011 
01/06/2011 
01/07/2011 
01/08/2011 
01/09/2011 
01/10/2011 
01/12/2011 

特定の列についてのみ変更する必要はありますか?

答えて

2

あなたはDateかなり単純Stringjava.util.DateComparable<Date>を実装しているため、列2のためgetColumnClass()からごTableModelリターンDate.classを聞かせするのに十分であるべきで見にhere

+0

迅速なリンクのおかげで、私は日付としてそれをレンダリングしようとすると、私はAWT-EventQueueの-0 『java.lang.IllegalArgumentExceptionが「スレッドで例外』例外を取得:日付として与えられたオブジェクトをフォーマットできません"、どうすれば解決できますか? – Vivek

+0

いいえ、それは文字列としてレンダリングしませんが、コンパレータでDateから文字列を作成し、次に –

5

を持っているとして、日付文字列を扱うコンパレータを実装する必要があります。 Custom Rendererを使用して日付を必要に応じてフォーマットします。

補足:ここにはsetDefaultRenderer()を使用した例があります。

import java.awt.*; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import javax.swing.*; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

/** @see http://stackoverflow.com/questions/4553448 */ 
public class TableDate extends JPanel { 

    private static final int INT_COL = 0; 
    private static final int DATE_COL = 1; 
    private final Calendar calendar = Calendar.getInstance(); 
    private final CustomModel model = new CustomModel(); 
    private final JTable table = new JTable(model); 

    public TableDate() { 
     super(new GridLayout(1, 0)); 
     table.setAutoCreateRowSorter(true); 
     table.setDefaultRenderer(Date.class, new DateRenderer()); 
     table.setPreferredScrollableViewportSize(new Dimension(320, 240)); 
     JScrollPane sp = new JScrollPane(table); 
     this.add(sp); 
     for (int i = 1; i <= 20; i++) { 
      model.addRow(newRow(i)); 
     } 
    } 

    private Object[] newRow(int i) { 
     calendar.add(Calendar.DAY_OF_YEAR, 1); 
     return new Object[]{Integer.valueOf(i), calendar.getTime()}; 
    } 

    private static class CustomModel extends DefaultTableModel { 

     private final String[] columnNames = {"Index", "Date"}; 

     @Override 
     public Class<?> getColumnClass(int col) { 
      if (col == INT_COL) { 
       return Integer.class; 
      } else if (col == DATE_COL) { 
       return Date.class; 
      } 
      return super.getColumnClass(col); 
     } 

     @Override 
     public int getColumnCount() { 
      return columnNames.length; 
     } 

     @Override 
     public String getColumnName(int col) { 
      return columnNames[col]; 
     } 
    } 

    private static class DateRenderer extends DefaultTableCellRenderer { 

     DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); 

     public DateRenderer() { 
      super(); 
     } 

     @Override 
     public void setValue(Object value) { 
      setText((value == null) ? "" : formatter.format(value)); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("TableDate"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TableDate().display(); 
      } 
     }); 
    } 
} 
+0

を比較します.2番目の列のgerColumnClassでDate.classを返すと、次のエラー例外が発生します。 lang.IllegalArgumentException:java.text.DateFormat.format(不明なソース)で日 \tとして与えられたオブジェクトをフォーマットできないjava.text.Format.formatで \t(不明なソース) \t javax.swing.JTableの$ DateRendererで。 setValue(不明なソース) \t at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent(不明なソース) – Vivek

+0

私は上記の例を追加しました。 – trashgod

関連する問題