GWT композитный виджет - PullRequest
       26

GWT композитный виджет

0 голосов
/ 02 марта 2011

Я пытаюсь создать собственный виджет 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(), тогда все в порядке, но виджет не центрируется. Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Проблема в том, что PopupPanel нельзя использовать в качестве «обычного» виджета, потому что он не будет прикреплен к родительскому элементу, но присоединяется к dom, чтобы гарантировать, что он находится на вершине. Поэтому использование initWidget во всплывающем окне не имеет смысла.

Чтобы сделать это, вы должны поместить LoginWidget в PopupPanel, а не наоборот. Вы можете сделать PopupPanel полем-членом и добавить метод show к вашей LoginPanel, который вызывает шоу в поле PopupPanel.

Если вы не хотите, чтобы виджет входа в систему перемещался независимо от родительского элемента или контекста, в котором вы используете виджет входа, вы не должны использовать PopupPanel.

0 голосов
/ 02 марта 2011

Полагаю, вам нужно вызывать initWidget как последнюю вещь. В противном случае вся обработка «детских» предметов не имеет ничего против.

Попробуйте, и если это не сработает, я постараюсь дать лучший ответ.

...