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 中向表格小部件添加排序。从 Snippet2sortListener处理程序复制代码不起作用。它正确地将两个项目交换为排序顺序。表中超过 2 项,结果难以预料。

在我看来(在从 Snippet2 提取的以下代码中sortListeneritems[i].dispose()将更改TableItems我们在外部 for 循环中迭代的被调用项的数组,for (int i = 1 ...... 此外,当一个项目是disposed(),并插入到新索引处的项目中时,整个数组被重新创建。那肯定会破坏迭代?

所以,我想我有两个问题:

  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 回答