2016-04-07 21 views
0

MatlabでJIDEグリッドの並べ替えと自動フィルタ処理機能を使用しています。私はgetColumnClassをオーバーライドし、フィルタリングとソートはIntegers、Double、String Columns(数値の場合は数値で、文字列の場合はそれぞれ字句順にソートしています)ではうまくいきます。日付列のgetColumnClassが無効になっています

しかし、私はDateカラムの大きな問題に直面しています。私はgetColumnクラスをオーバーライドし、Date.classとして定義しました。しかし、フォーマットを理解して正しく動作させるために、日付(生データのように)をフィルタリングとソートに渡すフォーマットを定義しなければならないと思います。

JIDEオートフィルタのデフォルトの日付形式は'07 -Apr-2016 'です。私は同じフォーマットにデータを変換しようとしましたが、運はありません。日付をフィルタリングしようとすると、(Unknown Source)例外がスローされます。私はそれが私の日付形式を理解していないと思う。 Date列のクラスをオーバーライドするときの日付形式はどのように定義できますか?

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: 
           java.util.Date cannot be cast to java.lang.String 
     at java.lang.String.compareTo(Unknown Source) 
     at com.jidesoft.filter.LessThanFilter.isValueFiltered(Unknown Source) 
     at com.jidesoft.grid.FilterableTableModel.shouldBeFiltered(Unknown Source) 

ここは、DefaultTableModelを上書きするMy TableModelクラスです。

import javax.swing.table.*; 
import java.util.Date; 

class MyTableModel extends DefaultTableModel { 

    public MyTableModel(Object rowData[][], Object columnNames[]) { 
     super(rowData, columnNames); 
    } 
    @Override 
    public Class getColumnClass(int col) { 
     switch (col){ 
      case 0: 
       return Integer.class; 
      case 1: case 2: case 9: 
      case 10: case 33: 
       return String.class; 
      case 3: 
       return Date.class; 
      default: 
       return Double.class; 
     } 
    } 
    @Override 
    public boolean isCellEditable(int row, int col) { 
     switch (col){ 
      case 28: case 29: case 30: case 31: case 32: 
       return true; 
      default: 
       return false; 
     } 
    } 
} 

答えて

2

私はJIDEについて何も知らないので、私のコメントはすべてJDKの通常のクラス用です。

JIDEオートフィルタのデフォルトの日付フォーマットは'07 -Apr-2016 'です。

これは私にとっては文字列のようです。列にDateが含まれるようにするには、DateオブジェクトをTableModelに格納する必要があります。日付の文字列表現ではありません。

通常、カスタムレンダラーをテーブルに追加して、日付を適切な形式で表示します。例えば

public class YMDRenderer extends DefaultTableCellRenderer 
{ 
    private Format formatter = new SimpleDateFormat("yy/MM/dd"); 

    public void setValue(Object value) 
    { 
     // Format the Object before setting its value in the renderer 

     try 
     { 
      if (value != null) 
       value = formatter.format(value); 
     } 
     catch(IllegalArgumentException e) {} 

     super.setValue(value); 
    } 
} 

はまた、あなたはレンダラにFormatオブジェクトを提供することにより、簡単に使用することができ、再利用可能なレンダラーが含まれているTable Format Renderersをチェックアウトすることができます。これにより、必要な各データフォーマットに固有のレンダラーを作成する必要がなくなります。

編集:私は、私は

は、あなたがに文字列を解析するSimpleDateFormatクラスとパース(String)メソッドを使用することができることを行うためにいくつかの並べ替えのFormatConverterを使用する必要が推測

Dateオブジェクト。

+0

私は同じ問題を説明し、解決されることを後で見つかった別のスレッドを混乱させて申し訳ありませんが、私は形式がテキストで目立たせることが日付に引用符を追加しました。カスタムのTableRendererを使用して、日付、色などの外観を既に制御しています。あなたは、Dateオブジェクトではなく私のTableModelに日付文字列があることを指摘しています。私はそれをするために何らかの種類のFormatConverterを使用しなければならないと思う、私はプログラマーではない、申し訳ありませんが、それに関する助言は参考になります。ありがとう。 – Amit

+0

@Amit、編集を参照してください。 – camickr

+0

ありがとう、すべてうまくいきました。 – Amit

0

例外:java.util.Dateはjava.lang.Stringにキャストできません。つまり、Camickrが指摘したように、DateオブジェクトはDateオブジェクトではなくTableModelに文字列として格納されていました。 SimpleDateFormatクラスを使用してStringオブジェクトをDateオブジェクトに変換しました。他の初心者のJavaラーナーのために、以下のコードスニペットを実行するだけです。

import javax.swing.table.*; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MyTableModel extends DefaultTableModel{ 
    public MyTableModel(Object rowData[][], Object columnNames[]){ 
     super(rowData, columnNames); 
     String ExpectedDateFormat = (String) ("dd/mm/yyyy"); 
     SimpleDateFormat format = new SimpleDateFormat(ExpectedDateFormat); 
     Date strToDate = null; 
     for (int i=0; i<rowData.length;i++){ 
      String DateStr = (String) super.getValueAt(i,3); 
        try { 
       strToDate = format.parse(DateStr); 
      // System.out.println(strToDate); 
      } catch (ParseException e) { 
      // e.printStackTrace(); 
      } 
      super.setValueAt(strToDate,i,3); 
     } 
    } 

    @Override 
    public Class getColumnClass(int col) { 
     switch (col){ 
      case 0: 
       return Integer.class; 
      case 1: case 2: case 9: 
      case 10: case 33: 
       return String.class; 
      case 3: 
       return Date.class; 
      default: 
       return Double.class; 
     } 
    } 

    @Override 
    public boolean isCellEditable(int row, int col) { 
     switch (col){ 
      case 28: case 29: case 30: case 31: case 32: 
       return true; 
      default: 
       return false; 
     } 
    } 
} 

uitableの日付データの表示は、Camickrは、上記と同じように同じクラス(のSimpleDateFormat)を使用して制御することができます。JIDE日付形式についてHERE

関連する問題