2011-03-02 6 views
0

나는 자체 GWT 위젯을 만들려고합니다. 나는 그것을 빌드하는 복합적인 방법을 선택한다. 하지만 문제가있어 위젯이 화면에 표시되지 않았습니다.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()에서

나는이 코드 평화가 : 나는 initWidget() 기능 뒤에 LoginPanel 클래스 행을 삭제하면

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

을 한 후, 여기에 복합 위젯 코드는 모두 맞지만 위젯은 중앙에 있지 않습니다. 누구든지 나를 도울 수 있습니까?

+0

, 그것은 위젯을 구성 할 수있는 훨씬 더 좋은 방법 : 문서에서 –

답변

0

저는 여러분이 마지막으로 initWidget을 호출해야한다고 생각합니다. 그렇지 않으면 '어린이'항목의 모든 처리에는 효과가없는 항목이 있습니다.

시도해보세요. 문제가 해결되지 않으면 시도해보고 더 나은 답변을 드리겠습니다.

+0

이있다 http://code.google.com/webtoolkit/doc/latest/DevGuideUiBinder.html : InitWidget으로 보호 void initWidget (위젯 위젯) 위젯이 합성물에 의해 포장되도록 설정합니다. 포장 된 위젯은이 객체의 위젯 메소드를 호출하거나 패널에 추가하기 전에 설정해야합니다. 이 메소드는, 지정된 복합체에 대해서 1 회만 호출 할 수가 있습니다. 매개 변수 : 위젯 - 래핑 할 위젯입니다. 여기를 확인 http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/ui/Composite.html#initWidget(com.google.gwt.user. client.ui.Widget) 이런 식으로 시도했지만 위젯이 가운데에 있지 않았습니다. – pierre

+0

'이 객체'는 합성 된 것을 의미하며 포장 된 위젯을 의미하지 않습니다. 래핑 된 위젯은 initWidget에 전달되기 전에 생성되어야합니다. 나는 당신이 마지막으로 initWidget을 할 때 당신의 위젯이 나타난다고 가정 할 것이다. 그 맞습니까? 센터링 문제는 CSS 문제와 비슷해 보이지만 initWidget/composite의 결과입니다. – Mikezx6r

2

PopupPanel은 정상적인 위젯으로 사용할 수 없습니다. 왜냐하면 부모에게 연결되어 있지 않기 때문에 dom에 붙어 있기 때문에 최상위에 있음을 보장합니다. 따라서 팝업에서 initWidget을 사용하는 것은 의미가 없습니다.

이 작업을 수행하려면 다른 방법 대신 PopupPanel에 LoginWidget을 넣어야합니다. PopupPanel을 멤버 필드로 만들고 PopupPanel 필드에서 쇼를 호출하는 LoginPanel에 메서드 show를 추가 할 수 있습니다.

로그인 위젯을 사용중인 부모 또는 컨텍스트에 상관없이 로그인 위젯을 플로팅하지 않으려면 PopupPanel을 사용하지 않아야합니다.

당신은 정말 UIBinder 사용을 고려해야합니다
+1

Composite 대신 DecoratedPopupPanel을 확장하고, initWidget 대신 setWidget()을 사용하고,'decoratedPopupPanel'에 대한 모든 현재 참조를'this'로 바꿉니다. –