有没有办法在 GWT 中有一个“可调整大小”的面板。
通过调整大小我的意思是如果你在面板的边缘拖动它可以相应地调整大小。
自己想出来的,举个例子:
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;
}
}
只需看这里:http ://code.google.com/p/resizepanel/ FF/IE/GChrome 有一个功能齐全的示例
在现代浏览器中,您可以独立于 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
除了 ,您还可以允许调整大小为horizontal
或both
。
如果您更喜欢以编程方式执行 UiBinder 方式,我相信您可以通过简单地将适当的样式添加到代码中的元素来适应它。
缺点?在 IE/Edge 中不起作用(嘿,我说的是现代浏览器......和CSS3),但在大多数其他.
看起来GWT-Ext小部件扩展在其可调整大小的面板中包含您想要的内容
对于 onBrowserEvent(...) 中的上述代码,不要忘记插入
event.preventDefault();
否则您将遇到Firefox图像拖动的麻烦!