の列に応じて、私はいくつかの列は次のような列挙型から番号が含まれているの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;
}
}
これでもう少し明確になりましたが、私は何か他のものが欠けていると思います。つまり、なぜHashMapを使用し、 'HashMap 'を使用しないのですか? –
あなたの提案に従ってコードを更新しました。残念ながら 'DefaultTableModel'のデフォルトの' Sorter'クラスは 'getValueAt()'をオーバーライドしても十分ではありません。なぜならテーブルモデルの中に保存されている元の数値をまだ考慮しているからです。だからこそ私はカスタムの 'Comparator'を追加して、ユーザがクリックしたカラムヘッダを切り替えるのです。 –
@LoryLoryそれはあなたの選択です、私は値に列挙定数を持つことは、単一のメソッド呼び出しでそのラベルにアクセスすることになると思う、そしてより一般的で、あなたのアプリケーションの他の部分で使用することができます。 – STaefi