2017-11-16 11 views
0

の列に応じて、私はいくつかの列は次のような列挙型から番号が含まれているのJTableを持っている:のJava:順序JTableの列挙

public static enum IMPORT_CONF_OPERATION_RESULT { 
    OK(0, "OK"), 
    ERROR(1, "ERROR"), 
    WAITING(2, "WAITING"); 
    /* ... */ 
} 

だから、私はをループテーブルモデルの方法getValueAt()を上書きするために必要な列の各列の対応するStringをデコードして返すために、列挙型の値を返します。データの元のデータベースでは、数値が格納されます。 ここで、ユーザーが対応するヘッダー列をクリックすると、行は数値に従ってソートされますが、アルファベット順に並べ替えたいと思います。テーブルモデルのメソッドsort()をオーバーライドしますか?記述を非効率的にするためにenum値を何回も繰り返していないのですか?それはテーブルの描画を遅くするだろうか?

UPDATE

これはSTaefiは私の拡張DefaultTableModelFieldの内側に、提案内容に以下の解決策が考えられます。

@Override 
public void sort(int col, boolean ascendest) { 
    ColumnProperties columnProperties = this.mapColumn.get(col); 
    if (COLUMN_NAME_ENTITY.equals(columnProperties.getInfo()) || 
     COLUMN_OPERATION_TYPE.equals(columnProperties.getInfo()) || 
     COLUMN_OPERATION_RESULT.equals(columnProperties.getInfo()) || 
     COLUMN_ELABORATION_TYPE.equals(columnProperties.getInfo()) || 
     COLUMN_EVENT_STATE.equals(columnProperties.getInfo())) { 
     Collections.sort((List<TableImportConfEvent>)this.value, new EnumColumnSorter(ascendest, columnProperties.getInfo())); 
     this.fireTableDataChanged(); 
    } 
    else { 
     super.sort(col, ascendest); 
    } 
} 

private class EnumColumnSorter implements Comparator<TableImportConfEvent> { 

    private int ascending; 
    private String columnName; 
    public EnumColumnSorter(boolean ascendest, String columnName) { 
     this.ascending = ascendest ? 1 : -1; 
     this.columnName = columnName; 
    } 
    @Override 
    public int compare(TableImportConfEvent o1, TableImportConfEvent o2) { 
     String decodedString1 = ""; 
     String decodedString2 = ""; 
     if (COLUMN_NAME_ENTITY.equals(this.columnName)) { 
      decodedString1 = getEntityName(o1.getEntityType()); 
      decodedString2 = getEntityName(o2.getEntityType()); 
     } 
     else if (COLUMN_OPERATION_TYPE.equals(this.columnName)) { 
      decodedString1 = getOperationName(o1.getOperationType()); 
      decodedString2 = getOperationName(o2.getOperationType()); 
     } 
     else if (COLUMN_OPERATION_RESULT.equals(this.columnName)) { 
      decodedString1 = getResultName(o1.getOperationResult()); 
      decodedString2 = getResultName(o2.getOperationResult()); 
     } 
     else if (COLUMN_ELABORATION_TYPE.equals(this.columnName)) { 
      decodedString1 = getResultName(o1.getOperationResult()); 
      decodedString2 = getResultName(o2.getOperationResult()); 
     } 
     else if (COLUMN_EVENT_STATE.equals(this.columnName)) { 
      decodedString1 = getStateName(o1.getEventState()); 
      decodedString2 = getStateName(o2.getEventState()); 
     } 
     return (decodedString1.compareTo(decodedString2)) * this.ascending; 
    } 
} 

答えて

1

各行ごとに列挙値をループ回避するには、作成することもできますstatic final HashMap<Integer,IMPORT_CONF_OPERATION_RESULT>は対応するラベルに値のマップをキャッシュし、列挙の内部の静的ブロックで初期化します。次に、public static String getLabelByValue(int value)にキャッシュを使用し、毎回ラベルを検索するのを避けるためにO(n)を使用することができます。

並べ替え順序と並べ替え操作を制御する場合は、TableRowSorterの後に移動することができますが、getValueAtをデフォルトの並べ替えで十分に上書きする必要があります。他の方法では、テーブルモデルでカスタムComparatorを使用してソートのロジックを管理します。

+0

これでもう少し明確になりましたが、私は何か他のものが欠けていると思います。つまり、なぜHashMap を使用し、 'HashMap 'を使用しないのですか? –

+0

あなたの提案に従ってコードを更新しました。残念ながら 'DefaultTableModel'のデフォルトの' Sorter'クラスは 'getValueAt()'をオーバーライドしても十分ではありません。なぜならテーブルモデルの中に保存されている元の数値をまだ考慮しているからです。だからこそ私はカスタムの 'Comparator'を追加して、ユーザがクリックしたカラムヘッダを切り替えるのです。 –

+0

@LoryLoryそれはあなたの選択です、私は値に列挙定数を持つことは、単一のメソッド呼び出しでそのラベルにアクセスすることになると思う、そしてより一般的で、あなたのアプリケーションの他の部分で使用することができます。 – STaefi