GWT复合小部件

时间:2011-03-02 14:32:24

标签: java gwt widget composite

我尝试构建自己的GWT小部件。我选择构建它的复合方式。但我有问题,小部件没有在屏幕上看到。这是复合小部件代码:

public class LoginPanel extends Composite {

private static final String DEFAULT_STYLENAME = "LoginPanel";

private TextBox nameField;
private PasswordTextBox passField;
private Button loginButton;
private Label errorLbl;
private DecoratedPopupPanel decoratedPopupPanel;

public LoginPanel() {
    nameField = new TextBox();
    passField = new PasswordTextBox();
    loginButton = new Button("Login");
    loginButton.getElement().setId("loginButton");
    errorLbl = new Label();

    Grid grid = new Grid(4, 2);
    grid.setWidget(0,0, errorLbl);
    grid.setWidget(1,0, new Label("Name"));
    grid.setWidget(1,1, nameField);
    grid.setWidget(2,0, new Label("Password"));
    grid.setWidget(2,1, passField);
    grid.setWidget(3,1, loginButton);

    decoratedPopupPanel = new DecoratedPopupPanel();
    initWidget(decoratedPopupPanel);
    //decoratedPopupPanel.setAnimationEnabled(true);
    decoratedPopupPanel.setWidget(grid);
    //decoratedPopupPanel.setAnimationEnabled(true);
    decoratedPopupPanel.setPopupPositionAndShow(new PopupPanel.PositionCallback() {
        public void setPosition(int i, int i1) {
            decoratedPopupPanel.setPopupPosition(Window.getClientWidth()/2, Window.getClientHeight()/2);
        }
    });
}

}

在入门课程函数onModuleLoad()中,我有这样的代码和平:

LoginPanel lp = new LoginPanel();
RootPanel.get().add(lp);

当我在LoginPanel函数后面的initWidget()类行中删除时,一切都是正确的,但是widget不是居中的。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

问题是PopupPanel不能用作'普通'小部件,因为它不会附加到父级,但它会将自身附加到dom以保证它位于顶部。因此在弹出窗口中使用initWidget是没有意义的。

要完成这项工作,您应该将LoginWidget放在PopupPanel中而不是相反。您可以将PopupPanel设置为成员字段,并向LoginPanel添加方法show,以调用PopupPanel字段上的show。

如果您不希望登录窗口小部件独立于您正在使用“登录”窗口小部件的父窗口或上下文浮动,则不应使用PopupPanel。

答案 1 :(得分:0)

我相信你必须调用initWidget作为最后一件事。否则,“儿童”物品的所有处理都没有任何可以解决的问题。

尝试一下,如果这不起作用,我会尝试给出更好的答案。