GWT SimplePanel может содержать только один дочерний виджет при работе с всплывающими окнами. - PullRequest
0 голосов
/ 25 апреля 2020

Я запутался с простой панелью и ее единственной дочерней функцией виджета.

Следующее вызовет исключение для одного дочернего виджета. Как всплывающее окно нарушает правило одного дочернего виджета? Если я создаю внутренний класс, расширяющий PopupPanel, то больше нет одного исключения виджета.

Спасибо

Class DashBoardPanel extends SimplePanel{
private PopupPanel popup=new PopupPanel(true);
...
public void initDashBoardPanel(ArrayList<EventDTO> _evtAry) 
{
    Iterator<EventDTO> it=_evtAry.iterator();
    int row=0; int col=0;
    while(it.hasNext()) 
    {
        final EventDTO evt=it.next();
        //every 3 column, next row
        if(col==3)
        {
            col=0;
            row=row+1;
        }
        Image evtPic=new Image(GWT.getHostPageBaseURL()+"photoServlet?photoName="+evt.getEvtPicName());
        evtPic.setSize("200px", "200px");
        Button editBtn=new Button("Edit");
        FlexTable evtTab=new FlexTable();
        evtTab.setWidget(0, 0, evtPic);
        evtTab.setWidget(1, 0, editBtn);
        this.evtFlexTable.setWidget(row, col, evtTab);
        editBtn.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                FlexTable table =new FlexTable();
                table.setWidget(0, 0, new Label(evt.getEvtName()));
                popup.add(table);
                popup.center();
            }
        });
        col=col+1;
    }
    frame.add(new Label("DASH BOARD"));
    frame.add(this.evtFlexTable);
    this.btnPanel.setWidget(0, 0, this.btn1);
    this.btnPanel.setWidget(0, 1, this.btn2);
    frame.add(this.btnPanel);
    this.add(frame);
}

Но если я создаю внутренний класс, расширяющий Popup, то SimplePanel не будет исключение одного дочернего виджета.

public class DashBoardPanel extends SimplePanel{
private EvtEditPopup evtEditPopup=new EvtEditPopup();
//Replaced the popup by this
public class EvtEditPopup extends PopupPanel
{
    FlexTable table =new FlexTable();
    String evtName="Event";
    //table.setWidget(0, 0, new Label(evt.getEvtName()));
    public EvtEditPopup()
    {
        super(true);
        table.setWidget(0, 0, new Label(evtName));
        this.add(table);
    }
    public void setEvtName(String _evtName)
    {
        this.evtName=_evtName;
        table.setWidget(0, 0, new Label(evtName));
    }
    public String getEvtName()
    {
        return this.evtName;
    }
}
public void initDashBoardPanel(ArrayList<EventDTO> _evtAry) 
......
editBtn.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                DashBoardPanel.this.evtEditPopup.setEvtName(evt.getEvtName());
                DashBoardPanel.this.evtEditPopup.center();
            }
        });

1 Ответ

3 голосов
/ 26 апреля 2020

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

GWT Showcase • DialogBox , например, с использованием VerticalPanel:

// Create a table to layout the content
VerticalPanel dialogContents = new VerticalPanel();
dialogContents.setSpacing(4);
dialogBox.setWidget(dialogContents);

Кроме того, вы должны следовать правилу над наследованием , используя Composite ( руководство по пользовательским виджетам ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...