GWT resizable panel

前端 未结 5 551
生来不讨喜
生来不讨喜 2020-12-16 21:33

Is there any way to have a \'Resizable\' panel in GWT.

By resizable I mean that if you you drag on the edge of Panel it can be resized accordingly.

5条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-16 22:26

    Figured it out myself, here is an example:

    public class DraggablePanel extends VerticalPanel {
        private boolean isBeingDragged = false;
        private boolean isBeingMoved = false;
        private Element movingPanelElement;
    
        public void setMovingPanelElement(Element movingPanelElement) {
            this.movingPanelElement = movingPanelElement;
        }
    
        public DraggablePanel() {
            super();
            DOM.sinkEvents(getElement(), Event.ONMOUSEDOWN | Event.ONMOUSEMOVE
                    | Event.ONMOUSEUP | Event.ONMOUSEOVER);
        }
    
        @Override
        public void onBrowserEvent(Event event) {
            final int eventType = DOM.eventGetType(event);
            if (Event.ONMOUSEOVER == eventType) {
                if (isCursorResize(event)) {
                    getElement().getStyle().setProperty("cursor", "s-resize");
                } else if (isCursorMove(event)) {
                    getElement().getStyle().setProperty("cursor", "move");
                } else {
                    getElement().getStyle().setProperty("cursor", "default");
                }
            }
            if (Event.ONMOUSEDOWN == eventType) {
                if (isCursorResize(event)) {
                    if (!isBeingDragged) {
                        isBeingDragged = true;
                        DOM.setCapture(getElement());
                    }
                } else if (isCursorMove(event)) {
                    DOM.setCapture(getElement());
                    isBeingMoved = true;
                }
            } else if (Event.ONMOUSEMOVE == eventType) {
                if (!isCursorResize(event) && !isCursorMove(event)) {
                    getElement().getStyle().setProperty("cursor", "default");
                }
                if (isBeingDragged) {
                    int currentY = event.getClientY();
                    int originalY = getElement().getAbsoluteTop();
                    if (currentY > originalY) {
                        Integer height = currentY - originalY;
                        this.setHeight(height + "px");
                    }
                } else if (isBeingMoved) {
                    RootPanel.get().setWidgetPosition(this,
                            event.getClientX(), event.getClientY());
                }
            } else if (Event.ONMOUSEUP == eventType) {
                if (isBeingMoved) {
                    isBeingMoved = false;
                    DOM.releaseCapture(getElement());
                }
                if (isBeingDragged) {
                    isBeingDragged = false;
                    DOM.releaseCapture(getElement());
                }
            }
        }
    
        protected boolean isCursorResize(Event event) {
            int cursor = event.getClientY();
            int initial = getAbsoluteTop();
            int height = getOffsetHeight();
            return initial + height - 20 < cursor && cursor <= initial + height;
        }
    
        protected boolean isCursorMove(Event event) {
            int cursor = event.getClientY();
            int initial = movingPanelElement.getAbsoluteTop();
            int height = movingPanelElement.getOffsetHeight();
            return initial <= cursor && cursor <= initial + height;
        }
    }
    

提交回复
热议问题