2011-04-28 57 views
2

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

这两个DialogBoxes中的第一个总是出现在浏览器屏幕的左上角,并且不能被拖拽,尽管DialogBox的一部分定义是它可以被拖拽。但是,第二个DialogBox可以在屏幕上拖动而不会出现任何问题。

我真的很喜欢第一个DialogBox出现在屏幕中间&是可拖动的,我认为这两种都会自动发生,但没有。

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

代码片段可用,如果他们帮助,但也许这个总体轮廓足够的一些指针。

感谢 尼尔

回答

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(); 
} 

两个框可以拖动并在浏览器窗口的中央。

+0

是的,这也适用于我,我一直在做类似的事情。我会尽力将我正在做的事情减少到最小的情况并发布。感谢您的帮助。 – 2011-04-30 00:08:32

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更多的信息。

+0

是的,再次,这工作得很好,但是这和我做了什么之间没有明显的区别。知道DialogBox默认是可拖动的是问题的症结所在,因为即使我想要,我也不知道这种行为的方式,但我的其中一个不会移动!感谢回复。 – 2011-04-30 00:10:36

0

好了,有了大量的试验和错误,我发现这个问题,这只是这样的:我有一个对象的方法我会基于对话框称为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的可拖动性,或者为什么使用基类(GwtEvent)而不是自定义扩展它的类应该会影响可拖动性。我怀疑像我这样的天真新手有几十个类似的陷阱。

(期待的对话框,以中心本身只是我的错误。)

1

你好像在控件重写此方法:

public void fireEvent(GwtEvent<?> event) { 
    if (handlerManager != null) { 
     handlerManager.fireEvent(event); 
    } 
    } 

窗口小部件,handlerManager指私人HandlerManager。

请将super.fireEvent(event)添加到您的方法中,或者您已将其重命名。