Перемещение элемента в таблице SWT / RCP - PullRequest
1 голос
/ 18 апреля 2011

У меня проблема с перемещением ячейки в таблице. У кого-нибудь есть идеи, как перемещать строки в таблице SWT? Я хочу изменить заказ пользователем взаимодействие и мне не нужно сортировать записи.

Я хотел бы добиться этого, перемещая выбранную строку вверх или вниз с помощью кнопки или перемещая элементы таблицы с помощью перетаскивания.

Я использую eclips 3.6 и java 1.6

Это то, что я пытаюсь с помощью перетаскивания, но не работает:

 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: Невозможно инициализировать удаление

Когда мне сообщат, в каком новом элементе (индекс в таблице) перемещен элемент, этого будет достаточно, тогда я смогу изменить Список своих объектов и перерисовать таблицу.

Есть идеи, как решить эту проблему?

С уважением, Haythem

Ответы [ 3 ]

0 голосов
/ 07 декабря 2011

Я понял что-то подобное, однако я не уверен, правильно ли я понял ваш вопрос.Обычно вы должны изменить свою модель и сохранить информацию об индексе элемента в вашей модели.Затем список представляется в правильном порядке с применением компаратора.Модификация модели затем обрабатывается соответствующей реализацией Drag / Drop.Таким образом, вы можете осуществить реорганизацию строк и правильную визуализацию для пользователя.

Это то, что вы имели в виду?

0 голосов
/ 17 июля 2017

здесь у меня есть простой код для замены / перемещения строки в RCP.я использовал кнопку ВВЕРХ и ВНИЗ, чтобы поменять местами строку просмотра таблицы.

  • Я добавил слушатель выбора для своей кнопки.

    возьму индекс выбранного элемента в таблице.

    сохранить исходный ввод средства просмотра таблиц в списке.

    сохранить выбранный элемент таблицы в переменной 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();
                }
    });
0 голосов
/ 20 апреля 2011

Я думаю, вам нужно добавить dragSupport в просмотрщик таблиц перед добавлением dropSupport.Вам не нужно использовать 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;
                }
            });
...