我在表中移动单元格时遇到问题。 有人知道如何在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
答案 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();
}
});