自定义组件:DragDropPopupPanel
public class DragDropPopupPanel extends FlowPanel {
final Button caption = new Button();
final Button closebtn = new Button("X");
final HorizontalPanel hp = new HorizontalPanel();
final VerticalPanel vp = new VerticalPanel();
final PopupPanel pop = new PopupPanel(false);
private List<Button> linked = new ArrayList();
private String CAPTION_HEIGHT = "20px";
public DragDropPopupPanel(UIObject uiObject) {
super();
initWidget();
}
private void initWidget() {
hp.add(caption);
hp.add(closebtn);
vp.add(hp);
pop.add(vp);
bindCloseButton();
caption.setStyleName("caption");
closebtn.setStyleName("btn");
caption.setHeight(CAPTION_HEIGHT);
caption.setWidth(880 + "px");
closebtn.setHeight(CAPTION_HEIGHT);
bindmouse();
}
private boolean dragging;
private int dragStartX, dragStartY;
private void bindmouse() {
caption.addMouseDownHandler(new MouseDownHandler() {
@Override
public void onMouseDown(MouseDownEvent event) {
dragging = true;
DOM.setCapture(caption.getElement());
dragStartX = event.getX();
dragStartY = event.getY();
}
});
caption.addMouseMoveHandler(new MouseMoveHandler() {
@Override
public void onMouseMove(MouseMoveEvent event) {
if (dragging) {
int absX = event.getX() + pop.getAbsoluteLeft();
int absY = event.getY() + pop.getAbsoluteTop();
setPopupPosition(absX - dragStartX, absY - dragStartY);
}
}
});
caption.addMouseUpHandler(new MouseUpHandler() {
@Override
public void onMouseUp(MouseUpEvent event) {
// TODO Auto-generated method stub
dragging = false;
DOM.releaseCapture(caption.getElement());
}
});
}
private void bindCloseButton() {
// TODO Auto-generated method stub
closebtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO Auto-generated method stub
hide();
}
});
}
public void add(Widget child) {
// TODO Auto-generated method stub
vp.add(child);
}
private void hide() {
// TODO Auto-generated method stub
for (Button widget : linked) {
widget.setEnabled(true);
}
this.pop.hide();
}
public void show() {
for (Button widget : linked) {
widget.setEnabled(false);
}
pop.show();
}
public void setPopupPosition(int left, int top) {
pop.setPopupPosition(left, top);
}
public void addLinkedWidget(Button btn) {
linked.add(btn);
}
}
Module:
public class MyPopTest implements EntryPoint {
public void onModuleLoad() {
final Button btn = new Button("button");
RootPanel.get("pop").add(btn);
btn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
DragDropPopupPanel ddpp = new DragDropPopupPanel(btn);
ddpp.addLinkedWidget(btn);
ddpp.show();
}
});
}
}
MyPopTest.gwt.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "http://gwtproject.org/doctype/2.7.0/gwt-module.dtd">
<module rename-to='stockwatcher'>
<inherits name="com.google.gwt.user.User" />
<inherits name='com.google.gwt.user.theme.clean.Clean' />
<inherits name="com.google.gwt.uibinder.UiBinder" />
<source path="client" />
<entry-point class="com.zn.client.MyPopTest"></entry-point>
</module>
MyPopTest.html
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>test</title>
<link rel="stylesheet" href="mypoptest.css">
<script type="text/javascript" language="javascript"
src="mypoptest/mypoptest.nocache.js"></script>
</head>
<body>
<h1>TEST</h1>
<div id="pop"></div>
</body>
</html>
mypoptext.css
@CHARSET "UTF-8";
body {
text-align: center;
font-family: verdana, sans-serif;
}
h1 {
font-size: 2em;
font-weight: bold;
color: #777777;
margin: 40px 0px 70px;
text-align: center;
}
.caption {
padding: 0px;
margin: 0px;
background: #8E99A5;
}
.btn {
padding: 0px;
background: #8E99A5;
text-align: center;
width:20px;
height:20px;
color:#FFFFFF;
margin: 0px;
}