2

事前定義された順序の列を持つJTableがあります。好き

+ ---------------------- +

| id | 名前|年齢|

列を順番に移動したい(たとえば、name = 0、age = 1、id = 2)。

+ ---------------------- +

|名前| 年齢| id |

どうすればそれを達成できますか?JTableにはメソッドmoveColumnsがありますが、残念ながらこれだけでは不十分です。順序がマップに格納されていると仮定します。

Map<String, Integer> columnOrder = getOrder();
for(Map.Entry<String, Integer> e : columnOrder.entrySet()) {
    int columnIndex = jtable.convertColumnIndexToView(jtable.getColumn(e.getKey()).getModelIndex());
    jtable.getColumnModel().moveColumn(columnIndex, e.getValue());
}

moveColumnは他の列も移動するため、これは機能しません。したがって、docuから:

void moveColumn(int columnIndex,
          int newIndex)

columnIndexの列とそのヘッダーをnewIndexに移動します。columnIndexの古い列は、newIndexにあります。newIndexにあった列は、スペースを空けるために左または右にシフトされます。

どういうわけか、マップとまったく同じ順序で列を配置できますか?

4

2 に答える 2

3

根本的な問題はもちろんVector、 が列を格納するために使用され、DefaultTableColumnModelその順序が適切な移動をサポートしていないことです。移動は、「左または右に移動」動作をトリガーする削除と追加として実現されます。

ただし、この知識を使用して、列を正しい順序で (最小インデックスから最大インデックスへ) 単純に移動できます。

から始まる

|id | name |age |

|name | age | id |

最初にインデックス 0 に移動することで実現できます。nameこれにより、

|name|id|age

ベクター。その後、年齢をインデックス 1 に移動すると、最初に削除が行われます

|name|id

続いて、インデックス 1 に挿入します

|name|age|id

要素が常に元の位置の左側に移動するようにすることで、シフトがどのように動作するかがわかります。

もちろん、これは実装の詳細に依存しますが、仮定をサポートし、それらの実装の詳細を使用するための簡単な単体テストを作成します (または独自のTableColumnModel;-) を作成します) 。

于 2012-09-25T13:36:44.013 に答える
0

編集

いいえ、行を並べ替える必要はありません。列を並べ替える必要があります

于 2012-09-25T13:22:56.080 に答える