我是GWT编程的新手。到目前为止,我有一个DialogBox,它应该收集登录名和密码,如果需要,可以启动另一个允许某人创建新帐户的DialogBox。
这两个DialogBox中的第一个始终显示在浏览器屏幕的左上角,并且无法拖动,尽管DialogBox的部分定义是可以拖动它。但是,第二个DialogBox可以毫无问题地在屏幕上拖动。
我真正喜欢的是第一个DialogBox出现在屏幕中间&可拖动,我认为这两种情况都会自动发生,但事实并非如此。
那么,什么东西可以阻止DialogBox被拖动? RootPanel上还没有任何内容。这有什么不同吗?
如果它们有用,可以使用代码片段,但也许这个大纲对于某些指针来说已经足够了。
由于 尼尔
答案 0 :(得分:3)
使用dialogBox.center()
这会将DialogBox置于屏幕中间。通常,DialogBox默认是可拖动的。
刚试了一下,如果你的RootPanel是空的,那就没关系了。当我在ModuleLoad上显示DialogBox时,它是可拖动的并且它居中。可能问题出在其他地方。
这是谷歌本身的例子:
public class DialogBoxExample implements EntryPoint, ClickListener {
private static class MyDialog extends DialogBox {
public MyDialog() {
// Set the dialog box's caption.
setText("My First Dialog");
// DialogBox is a SimplePanel, so you have to set its widget property to
// whatever you want its contents to be.
Button ok = new Button("OK");
ok.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
MyDialog.this.hide();
}
});
setWidget(ok);
}
}
public void onModuleLoad() {
Button b = new Button("Click me");
b.addClickListener(this);
RootPanel.get().add(b);
}
public void onClick(Widget sender) {
// Instantiate the dialog box and show it.
new MyDialog().show();
}
}
Here有关DialogBox的更多信息。
答案 1 :(得分:1)
如果没有看到任何代码,很难说出错了什么。以下代码适用于我(忽略缺少的样式......):
public void onModuleLoad() {
FlowPanel login = new FlowPanel();
Button create = new Button("create");
login.add(new TextBox());
login.add(new TextBox());
login.add(create);
create.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
final DialogBox box = new DialogBox();
FlowPanel panel = new FlowPanel();
Button close = new Button("close");
close.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
box.hide();
}
});
panel.add(new Label("some content"));
panel.add(close);
box.setWidget(panel);
box.center();
}
});
DialogBox firstBox = new DialogBox(false, true);
firstBox.setWidget(login);
firstBox.center();
}
这两个框都可以拖动并显示在浏览器窗口的中央。
答案 2 :(得分:1)
看起来你在Widget中重写了这个方法:
public void fireEvent(GwtEvent<?> event) {
if (handlerManager != null) {
handlerManager.fireEvent(event);
}
}
在Widget中,handlerManager引用私有HandlerManager。
将super.fireEvent(event)添加到您的方法中,或者将其重命名为。
答案 3 :(得分:0)
嗯,通过大量的试验和错误,我发现了问题,就是这样:我在一个基于DialogBox的对象中有一个名为fireEvent的方法,看起来像这样:
public void fireEvent(GwtEvent<?> event)
{
handlerManager.fireEvent(event);
}
然后,当在DialogBox上单击一个按钮时,将创建一个事件并将其发送到handlerManager以便正确触发。
事实证明,如果我将其更改为此(LoginEvent是一个自定义构建的事件):
public void fireEvent(LoginEvent event)
{
handlerManager.fireEvent(event);
}
......或者......
public void fireAnEvent(GwtEvent<?> event)
{
handlerManager.fireEvent(event);
}
DialogBox是可拖动的。但是,如果方法以行
开头public void fireEvent(GwtEvent<?> event)
然后结果是一个无法拖动的DialogBox。
我有点不安,因为我无法理解为什么我选择的方法名称应该影响DialogBox的可拖动性,或者为什么使用基类(GwtEvent)而不是自定义类扩展它应该影响可拖动性。我怀疑像我这样天真的新手有几十个类似的陷阱。
(期待DialogBox居中,这只是我的错误。)