GWT中的DialogBox不可拖动或居中

时间:2011-04-28 23:54:12

标签: gwt dialog

我是GWT编程的新手。到目前为止,我有一个DialogBox,它应该收集登录名和密码,如果需要,可以启动另一个允许某人创建新帐户的DialogBox。

这两个DialogBox中的第一个始终显示在浏览器屏幕的左上角,并且无法拖动,尽管DialogBox的部分定义是可以拖动它。但是,第二个DialogBox可以毫无问题地在屏幕上拖动。

我真正喜欢的是第一个DialogBox出现在屏幕中间&可拖动,我认为这两种情况都会自动发生,但事实并非如此。

那么,什么东西可以阻止DialogBox被拖动? RootPanel上还没有任何内容。这有什么不同吗?

如果它们有用,可以使用代码片段,但也许这个大纲对于某些指针来说已经足够了。

由于 尼尔

4 个答案:

答案 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居中,这只是我的错误。)