8

有没有办法在 GWT 中有一个“可调整大小”的面板。

通过调整大小我的意思是如果你在面板的边缘拖动它可以相应地调整大小。

4

5 回答 5

7

自己想出来的,举个例子:

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;
    }
}
于 2009-01-03T14:33:09.087 回答
2

只需看这里:http ://code.google.com/p/resizepanel/ FF/IE/GChrome 有一个功能齐全的示例

于 2009-03-20T23:59:26.117 回答
1

在现代浏览器中,您可以独立于 GWT 来解决这个问题。更容易和更清洁。只需使用 CSS3resize属性,并指定一个overflow不同于默认值 ( visible) 的值。

请注意,您可能希望覆盖resize子元素的属性,这样它们就不会全部继承调整大小句柄。

就我而言,我的.ui.xml文件中有这样的内容:

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

在我的样式表中有这样的内容(GWT 添加了一些额外的 div,因此您可能需要调整选择器以适合您的情况):

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

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

这给了我FlexTable在右下角调整大小的句柄,如下所示:

调整手柄大小

用户可以向下拖动手柄以垂直调整包含我的FlexTable. 当然,vertical除了 ,您还可以允许调整大小为horizontalboth

如果您更喜欢以编程方式执行 UiBinder 方式,我相信您可以通过简单地将适当的样式添加到代码中的元素来适应它。

缺点?在 IE/Edge 中不起作用(嘿,我说的是现代浏览器......和​​CSS3),但在大多数其他.

于 2016-02-19T01:43:49.997 回答
0

看起来GWT-Ext小部件扩展在其可调整大小的面板中包含您想要的内容

于 2009-01-02T05:36:55.170 回答
0

对于 onBrowserEvent(...) 中的上述代码,不要忘记插入

 event.preventDefault();

否则您将遇到Firefox图像拖动的麻烦!

于 2009-07-09T09:55:49.470 回答