1

http://git.eclipse.org/c/platform/eclipse.platform.swt.git/tree/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet2.java

SWT でテーブル ウィジェットに並べ替えを追加しようとしています。Snippet2 sortListenerHandler からコードをコピーしても機能しません。2 つの項目を正しく並べ替えて並べ替えます。テーブルに 2 つ以上の項目があり、結果は予測できません。

私には (次の Snippet2 から抽出したコードでsortListener) 、外側の for ループで繰り返し処理している呼び出された項目 のitems[i].dispose()配列を変更しようとしているように思えます。アレイ全体が新たに再作成されます。それは確かに反復を壊しますか?TableItemsfor (int i = 1 ......disposed()

だから、私は2つの質問があると思います:

  1. Snippet2 のアルゴリズムについて理解していないことは何ですか?
  2. ソート操作がランダムな結果を返す可能性がある他の明らかな理由はありますか?

これが私のコードです:

Listener sortListener = new Listener() {
    public void handleEvent(Event e) {
        TableItem[] items = table.getItems();
        Collator collator = Collator.getInstance(Locale.getDefault());
        TableColumn column = (TableColumn)e.widget;
        int index = column == column1 ? 0 : 1;
        for (int i = 1; i < items.length; i++) {                <--------- HERE
            String value1 = items[i].getText(index);
            for (int j = 0; j < i; j++){
                String value2 = items[j].getText(index);
                if (collator.compare(value1, value2) < 0) {
                    String[] values = {items[i].getText(0), items[i].getText(1)};
                    items[i].dispose();                         <--------- HERE
                    TableItem item = new TableItem(table, SWT.NONE, j);
                    item.setText(values);
                    items = table.getItems();                   <--------- HERE

                    break;
                }
            }
        }
        table.setSortColumn(column);
    }
};
4

2 に答える 2

1

このコードスニペットは、テーブル内の任意の数のアイテムに対して機能します(私はそれをテストしました)。
ただし、2列でのみ機能します。(それはあなたの問題ですか?)
テーブルにさらに列がある場合、コードは次のようになります。

    Listener sortListener = new Listener() {
        public void handleEvent(Event e) {
            TableItem[] items = table.getItems();
            Collator collator = Collator.getInstance(Locale.getDefault());
            TableColumn column = (TableColumn)e.widget;
            int index = table.indexOf(column);
            for (int i = 1; i < items.length; i++) {             //   <--------- HERE
                String value1 = items[i].getText(index);
                for (int j = 0; j < i; j++){
                    String value2 = items[j].getText(index);
                    if (collator.compare(value1, value2) < 0) {
                        String[] values = new String[table.getColumnCount()];
                        for (int columnIdx = 0; columnIdx < table.getColumnCount(); 
                                columnIdx++){
                            values[columnIdx] = items[i].getText(columnIdx);
                        }
                        items[i].dispose();                      //   <--------- HERE
                        TableItem item = new TableItem(table, SWT.NONE, j);
                        item.setText(values);
                        items = table.getItems();                //   <--------- HERE

                        break;
                    }
                }
            }
            table.setSortColumn(column);
        }
    };
于 2012-12-26T06:01:03.640 に答える
0

SWT テーブル ( org.eclipse.jface.viewers.TableViewer ) にJFace ラッパーを使用すると、テーブルにより多くの機能が組み込まれます。JFace TableViewer のこのチュートリアルをお勧めします。ここでは、 TableViewer を並べ替えるためのチュートリアルを示します。

于 2012-12-26T06:33:33.033 に答える