在表SWT / RCP中移动项目

时间:2011-04-18 08:30:35

标签: java eclipse swt eclipse-rcp

我在表中移动单元格时遇到问题。 有人知道如何在SWT表中移动行吗?我想按用户更改订单 互动,我不需要对条目进行排序。

我想通过buttonklick向上或向下移动选定的行或通过拖放移动表项来实现此目的。

我正在使用eclips 3.6和java 1.6

这是我尝试使用Drag and Drop但不能正常工作:

 Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer()};
    DragSource source = new DragSource(table, DND.DROP_MOVE );
    source.setTransfer(types);

    source.addDragListener(new DragSourceAdapter() {
      public void dragSetData(DragSourceEvent event) {
        // Get the selected items in the drag source
        DragSource ds = (DragSource) event.widget;
        Table table = (Table) ds.getControl();
        TableItem[] selection = table.getSelection();
        System.out.println(" drag "+  selection[0].getText());
      }
    });

    DropTarget target = new DropTarget(table, DND.DROP_MOVE | DND.DROP_DEFAULT);
    target.setTransfer(types);
    TableViewer tb = new TableViewer(table);
    tb.addDropSupport(DND.DROP_MOVE, types, new ViewerDropAdapter(viewer) {

        @Override
        public boolean validateDrop(Object target, int operation,
                TransferData transferType) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean performDrop(Object data) {
            // TODO Auto-generated method stub
            return false;
        }
    });

我想要移动的物品比柱子更多。

我变成的错误是:

org.eclipse.swt.SWTError:无法初始化Drop

当我被告知哪个新项目(表中的索引)是移动的项目时,我就可以更改我的对象列表并重新绘制表格。

知道如何解决这个问题吗?。

此致 Haythem

3 个答案:

答案 0 :(得分:0)

我认为在添加dropSupport之前需要向表查看器添加dragSupport。您不需要使用DragSource:

    TableViewer viewer = new TableViewer(table);
    Transfer[] types = new Transfer[] { PluginTransfer.getInstance() };
    viewer.addDragSupport(DND.DROP_MOVE, types, new DragSourceAdapter() {
                @Override
                public void dragSetData(DragSourceEvent event) {
                    // Get the selected items in the drag source
                    DragSource ds = (DragSource) event.widget;
                    Table table = (Table) ds.getControl();
                    TableItem[] selection = table.getSelection();
                    System.out.println(" drag " + selection[0].getText());
                }
            });

     viewer.addDropSupport(DND.DROP_MOVE, types, new ViewerDropAdapter(viewer) {

                @Override
                public boolean validateDrop(Object target, int operation, TransferData transferType) {
                    // TODO Auto-generated method stub
                    return false;
                }

                @Override
                public boolean performDrop(Object data) {
                    // TODO Auto-generated method stub
                    return false;
                }
            });

答案 1 :(得分:0)

我已经意识到这样的事情,但我不确定我的问题是否正确。通常,您必须修改模型并在模型中存储元素索引的信息。然后通过应用比较器以正确的顺序呈现该列表。然后,通过相应的拖放实现来处理模型的修改。通过这种方式,您可以实现向用户重新排列行和正确的可视化。

这是你的意思吗?

答案 2 :(得分:0)

这里我有一个简单的代码来交换/移动RCP中的行。我使用上下按钮来交换表格查看器的行。

  • 我在我的按钮上添加了一个选择监听器。

    获取表格中的选定项目索引。

    将表格查看器的原始输入保存在列表中。

    将所选的表项存储在temp变量中。

    然后从列表中删除。

    将temp变量添加到带索引的列表中(+1表示向下,-1表示向上)

例如: -

button.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            int selectionIndex = TableViewer.getTable().getSelectionIndex();


            EObjectContainmentEList<Object> input = (EObjectContainmentEList<Object>) TableViewer.getInput();
            Attribute basicGet = input.basicGet(selectionIndex);
            input.remove(selectionIndex);
            input.add(selectionIndex-1, basicGet);
            TableViewer.setInput(input);
            TableViewer.refresh();
                }
    });