Frage

Gibt es eine Möglichkeit, eine 'Resizable' Panel in GWT haben.

Mit der Größe veränderbar Ich meine, wenn man Sie am Rande des Panels ziehen sie entsprechend der Größe verändert werden.

War es hilfreich?

Lösung

ich es herausgefunden, hier ein Beispiel:

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;
    }
}

Andere Tipps

Sehen Sie nur hier: http://code.google.com/p/resizepanel/ Es ist ein voll funktionsfähiges Beispiel für FF / IE / GChrome

In der modernen Browsern können Sie diese unabhängig von GWT lösen. Viel einfacher und sauberer. Verwenden Sie einfach die CSS3 resize Eigenschaft, und geben Sie eine overflow anderer Wert als der Standardwert (visible).

Beachten Sie, dass Sie wahrscheinlich die resize Eigenschaft für untergeordnete Elemente außer Kraft setzen wollen, so dass sie alle nicht erben die Größe Griff.

In meinem Fall, ich habe so etwas in meiner .ui.xml-Datei:

<g:HTMLPanel addStyleNames="myTableContainer">
    <g:ScrollPanel>
        <g:FlexTable ui:field="myTable"></g:FlexTable>
    </g:ScrollPanel>
</g:HTMLPanel>

Und etwas wie dies in meinem Sheet (GWT fügt einige zusätzliche divs, so müssen Sie möglicherweise Wähler einstellen für Ihren Fall arbeiten):

.myTableContainer div {
    resize: vertical;
    overflow: auto;
}

.myTableContainer div div {
    resize: none;
    overflow: visible;
}

Das gibt mein FlexTable einen Anfasser in der unteren rechten Ecke, wie folgt aus:

Der Benutzer kann den Griff nach unten ziehen, um vertikal die Platte enthält meine FlexTable zu ändern. Selbstverständlich kann anstelle von vertical, können Sie auch horizontal oder both zu Größenanpassung zulassen.

Wenn Sie es vorziehen, Dinge programmatisch auf die UiBinder Art und Weise zu tun, ich bin sicher, dass Sie es, indem Sie einfach die entsprechenden Stile Ihre Elemente im Code anpassen können.

Die Nachteile? Funktioniert nicht in IE / Edge (hey, ich sagte, moderne Browser ... und CSS3 ), aber in die meisten anderen .

Es sieht aus wie der GWT-Ext Widget Erweiterungen enthält, was Sie wollen in seine Resizable-Panel

Für den Code oben in onBrowserEvent (...) nicht vergessen Einfügen

 event.preventDefault();

oder Sie haben Probleme mit firefox Bild Schleppen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top