直端连接中的GWT接头有问题
我试图在小部件之间建立直端连接。但当我这样做时,我的连接器的方向出现错误。它总是与所需的方向平行。此外,它独立于连接的小部件,即当我移动小部件时,我的连接器不会移动。我的代码片段如下所示: 指向问题快照的链接: 公共类DragNDropPage{直端连接中的GWT接头有问题,gwt,drag-and-drop,gxt,connector,Gwt,Drag And Drop,Gxt,Connector,我试图在小部件之间建立直端连接。但当我这样做时,我的连接器的方向出现错误。它总是与所需的方向平行。此外,它独立于连接的小部件,即当我移动小部件时,我的连接器不会移动。我的代码片段如下所示: 指向问题快照的链接: 公共类DragNDropPage{ SyncCurrentUser cu = SyncCurrentUser.getUser(); private AbsolutePanel area = new AbsolutePanel(); HorizontalPanel toolsPanel =
SyncCurrentUser cu = SyncCurrentUser.getUser();
private AbsolutePanel area = new AbsolutePanel();
HorizontalPanel toolsPanel = new HorizontalPanel();
AbsolutePanel canvas = new AbsolutePanel();
DragController toolboxDragController;
Label startLabel = new Label("START");
Label stopLabel = new Label("STOP");
Label activityLabel = new Label("ACTIVITY");
Label processLabel = new Label("PROCESS");
Button stopDrag = new Button("Done Dragging");
Button saveButton = new Button("Save");
PickupDragController dragController = new PickupDragController(area, true);
AbsolutePositionDropController dropController = new AbsolutePositionDropController(area);
private List<Widget> selected = new ArrayList<Widget>();
private List<Widget> onCanvas = new ArrayList<Widget>();
private List<Connection> connections = new ArrayList<Connection>();
private CActivity[] aItems;
private CProcess[] pItems;
MyHandler handler = new MyHandler();
int mouseX,mouseY;
String style;
public DragNDropPage() {
toolboxDragController = new ToolboxDragController(dropController, dragController);
RootPanel.get("rightbar").add(area);
area.setSize("575px", "461px");
area.add(toolsPanel);
toolsPanel.setSize("575px", "37px");
toolsPanel.add(startLabel);
startLabel.setSize("76px", "37px");
toolboxDragController.makeDraggable(startLabel);
toolsPanel.add(stopLabel);
stopLabel.setSize("66px", "37px");
toolboxDragController.makeDraggable(stopLabel);
toolsPanel.add(activityLabel);
activityLabel.setSize("82px", "36px");
toolboxDragController.makeDraggable(activityLabel);
toolsPanel.add(processLabel);
processLabel.setSize("85px", "36px");
toolboxDragController.makeDraggable(processLabel);
stopDrag.addClickHandler(handler);
toolsPanel.add(stopDrag);
stopDrag.setWidth("114px");
saveButton.addClickHandler(handler);
toolsPanel.add(saveButton);
area.add(canvas, 0, 36);
canvas.setSize("575px", "425px");
Event.addNativePreviewHandler(new Event.NativePreviewHandler() {
@Override
public void onPreviewNativeEvent(NativePreviewEvent event) {
//46 is the key code for Delete Button
if(event.getNativeEvent().getKeyCode() == 46 && !selected.isEmpty()) {
for (Iterator<Widget> i = selected.listIterator(); i.hasNext();) {
Widget w = (Widget) i.next();
UIObjectConnector.unwrap(w);
i.remove();
w.removeFromParent();
onCanvas.remove(i);
}
}
}
});
aItems = cu.currentUser.getcActivity();
pItems = cu.currentUser.getcProcess();
}
private class ToolboxDragController extends PickupDragController {
public ToolboxDragController(final DropController dropController, final DragController nodesDragController) {
super(area ,false);
setBehaviorDragProxy(true);
registerDropController(dropController);
addDragHandler(new DragHandlerAdapter(){
public void onPreviewDragEnd(DragEndEvent event) throws VetoDragException {
Widget node = (Widget) event.getSource();
int left = event.getContext().desiredDraggableX;
int top = event.getContext().desiredDraggableY;
AbsolutePanel panel = (AbsolutePanel) dropController.getDropTarget();
createConnector((Label) node, panel, left, top);
throw new VetoDragException();
}
});
}
}
protected UIObjectConnector createConnector(Label proxy, AbsolutePanel panel, int left, int top) {
Widget w;
String str = proxy.getText();
if(str.equals("START") || str.equals("STOP")){
w = new Label(proxy.getText()){
public void onBrowserEvent(Event event) {
if( DOM.eventGetType(event) == 4
&& DOM.eventGetCtrlKey(event)){
select(this);
}
super.onBrowserEvent(event);
}
};
w.getElement().setClassName("dnd-start-stop");
}
else{
w = new ListBox(){
public void onBrowserEvent(Event event) {
if( DOM.eventGetType(event) == 4
&& DOM.eventGetCtrlKey(event)){
select(this);
}
super.onBrowserEvent(event);
}
};
if(str.equals("ACTIVITY")){
getAItems((ListBox)w);
//w.getElement().addClassName("dnd-activity");
}
else if(str.equals("PROCESS")){
getPItems((ListBox)w);
//w.getElement().addClassName("dnd-process");
}
}
onCanvas.add(w);
left -= panel.getAbsoluteLeft();
top -= panel.getAbsoluteTop();
//panel.add(w,10,10);
panel.add(w, left, top);
dragController.makeDraggable(w);
return UIObjectConnector.wrap(w);
}
private void getAItems(ListBox w) {
for(int i=0;i<aItems.length;i++)
w.addItem(aItems[i].getActivityName());
}
private void getPItems(ListBox w) {
/*for(int i=0;i<pItems.length;i++)
w.addItem(pItems[i].getProcessName());*/
w.addItem("Process1");
}
protected void select(Widget w){
if(selected.isEmpty()) {
selected.add(w);
w.getElement().addClassName("color-green");
} else if(selected.contains(w)){
selected.remove(w);
w.getElement().removeClassName("color-green");
} else if(selected.size() == 1) {
Widget w2 = (Widget) selected.get(0);
connect(UIObjectConnector.getWrapper(w2), UIObjectConnector.getWrapper(w));
selected.clear();
}
}
protected void connect(Connector a, Connector b) {
//System.out.println(a.getLeft());
//System.out.println(b.getLeft());
add(new StraightTwoEndedConnection(a,b));
}
private void add(StraightTwoEndedConnection c) {
canvas.add(c);
connections.add(c);
c.update();
}
protected void remove(Connection c) {
connections.remove(c);
}
class MyHandler implements ClickHandler{
@Override
public void onClick(ClickEvent event) {
Button name = (Button) event.getSource();
if(name.equals(stopDrag)){
if(name.getText().equals("Done Dragging")){
for(Iterator<Widget> i = onCanvas.listIterator();i.hasNext();){
Widget w = (Widget) i.next();
dragController.makeNotDraggable(w);
}
name.setText("Continue");
}
else {
for(Iterator<Widget> i = onCanvas.listIterator();i.hasNext();){
Widget w = (Widget) i.next();
dragController.makeDraggable(w);
}
name.setText("Done Dragging");
}
}
else{
}
}
}
SyncCurrentUser cu=SyncCurrentUser.getUser();
专用AbsolutePanel区域=新AbsolutePanel();
水平面板工具面板=新水平面板();
AbsolutePanel画布=新建AbsolutePanel();
拖拉控制器工具箱拖拉控制器;
标签标签=新标签(“开始”);
标签停止标签=新标签(“停止”);
标签活动标签=新标签(“活动”);
标签流程标签=新标签(“流程”);
按钮停止拖动=新按钮(“完成拖动”);
按钮保存按钮=新按钮(“保存”);
PickupDragController dragController=新的PickupDragController(区域,真);
AbsolutePositionDropController dropController=新的AbsolutePositionDropController(区域);
所选私有列表=新建ArrayList();
private List onCanvas=new ArrayList();
私有列表连接=新建ArrayList();
私人活动[]aItems;
私有过程[]陷阱;
MyHandler=新的MyHandler();
int mouseX,mouseY;
弦乐风格;
公共DragNDropPage(){
toolboxDragController=新toolboxDragController(dropController,dragController);
RootPanel.get(“rightbar”).add(区域);
面积设置尺寸(“575px”、“461px”);
面积。添加(工具板);
工具板设置尺寸(“575px”、“37px”);
toolsPanel.add(标签);
设置大小(“76px”、“37px”);
toolboxDragController.MakedDragable(StartAbel);
工具面板。添加(停止标签);
stopLabel.setSize(“66px”、“37px”);
toolboxDragController.makeDragable(停止标签);
toolsPanel.add(活动标签);
activityLabel.setSize(“82px”、“36px”);
toolboxDragController.makeDraggable(活动标签);
toolsPanel.add(过程标签);
processLabel.setSize(“85px”、“36px”);
toolboxDragController.makeDragable(processLabel);
stopDrag.addClickHandler(handler);
toolsPanel.add(停止拖动);
停止阻力。设定宽度(“114px”);
saveButton.addClickHandler(处理程序);
toolsPanel.add(保存按钮);
添加(画布,0,36);
画布设置大小(“575px”、“425px”);
Event.addNativePreviewHandler(新事件.NativePreviewHandler(){
@凌驾
PreviewActiveEvent上的公共无效(NativePreviewEvent事件){
//46是删除按钮的关键代码
如果(event.getNativeEvent().getKeyCode()==46&&!selected.isEmpty()){
for(迭代器i=selected.listIterator();i.hasNext();){
Widget w=(Widget)i.next();
UIObjectConnector.展开(w);
i、 删除();
w、 removeFromParent();
onCanvas.remove(i);
}
}
}
});
aItems=cu.currentUser.getcActivity();
pItems=cu.currentUser.getcProcess();
}
私有类ToolboxDragController扩展PickupDragController{
公共工具箱DragController(最终DropController DropController,最终DragController节点DragController){
超级(面积,假);
setBehaviorDragProxy(真);
registerDropController(dropController);
addDragHandler(新DragHandlerAdapter(){
public void onPreviewDragEnd(DragEndEvent事件)引发VetoDragException{
Widget节点=(Widget)event.getSource();
int left=event.getContext().desiredDraggableX;
int top=event.getContext().desiredDraggableY;
AbsolutePanel=(AbsolutePanel)dropController.getDropTarget();
createConnector((标签)节点,面板,左侧,顶部);
抛出新的VetoDragException();
}
});
}
}
受保护的UIObjectConnector createConnector(标签代理、绝对面板面板、int-left、int-top){
小部件w;
String str=proxy.getText();
如果(str.equals(“开始”)| | str.equals(“停止”)){
w=新标签(proxy.getText()){
公共无效onBrowserEvent(事件){
if(DOM.eventGetType(event)==4
&&DOM.eventGetCtrlKey(事件)){
选择(这个);
}
超级浏览器事件(事件);
}
};
w、 getElement().setClassName(“dnd开始-停止”);
}
否则{
w=新列表框(){
公共无效onBrowserEvent(事件){
if(DOM.eventGetType(event)==4
&&DOM.eventGetCtrlKey(事件)){
选择(这个);
}
超级浏览器事件(事件);
}
};
如果(str.equals(“活动”)){
getAItems((列表框)w);
//w、 getElement().addClassName(“dnd活动”);
}
else if(str.equals(“过程”)){
getPItems((列表框)w);
//w、 getElement().addClassName(“dnd进程”);
}
}
onCanvas.add(w);
left-=panel.getAbsoluteLeft();
top-=panel.getAbsoluteTop();
//面板。添加(w,10,10);
面板。添加(w,左侧,顶部);
拖动控制器。使可拖动(w);
返回UIObjectConnector.wrap(w);
}
私有void getAItems(列表框w){
对于(inti=0;i我知道这已经很老了,但是我在gwt连接器库中遇到了类似的问题
如果使用的是标准模式,则连接器不会显示在正确的位置。请改用怪癖模式
此外,在拖动dnd组件(在拖动侦听器中)时,需要手动执行connector.update(),以便在拖动时连接随端点一起移动