2010-12-29 4 views
0

나는 JTable을 가지고 있으며 정렬을 추가했습니다. 이제 JTable에는 5 개의 열과 날짜 필드의 두 번째 열이 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

당신은 비교적 간단 StringDate는 모습을 here

+0

덕분에, 나는 "스레드에서 예외"AWT-EventQueue의-0 "java.lang.IllegalArgumentException가 예외를 얻을 : 날짜로 지정된 객체를 포맷 할 수 없습니다 "어떻게 해결할 수 있습니까? – Vivek

+0

아니 문자열로 그것을 렌더링하지만 비교에서 Date에서 문자열을 만든 다음 –

5

java.util.Date 때문에 구현 Comparable<Date>를 가지고 날짜 문자열을 처리하는 비교기를 구현해야, 열 두 getColumnClass()에서 TableModel 반환 Date.class을하게하기에 충분해야한다. 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

내 gerColumnClass에서 열 2에 대한 Date.class 반환하면 "AWT-EventQueue-0"Java 스레드에서 다음 오류 예외가 발생합니다. lang.IllegalArgumentException는 : javax.swing.JTable를 $ DateRenderer에서 java.text.Format.format (알 수없는 소스) \t에서 java.text.DateFormat.format (알 수없는 소스) \t에서 날짜 \t로 지정된 객체를 포맷 할 수 없습니다. setValue (Unknown Source) \t at javax.swing.table.DefaultTableCellRenderer.getTableCellRendererComponent (알 수없는 소스) – Vivek

+0

위 예제를 추가했습니다. – trashgod