GWT:从菜单栏获取对DockLayoutPanel的引用

GWT:从菜单栏获取对DockLayoutPanel的引用,gwt,Gwt,我是一个新手,尝试使用菜单栏来交换DeckPanel中显示的面板 我有2个类和2个关联的uibinder XML文件: ApplicationUi.java ApplicationUi.ui.xml ApplicationMenu.java ApplicationMenu.ui.xml 在ApplicationUi.java和UI XML中,根目录绑定到DockLayoutPanel。ApplicationMenu位于DockLayoutPanel的北段。菜单栏选项将影响中间部分的装饰板 在

我是一个新手,尝试使用菜单栏来交换DeckPanel中显示的面板

我有2个类和2个关联的uibinder XML文件:

  • ApplicationUi.java
  • ApplicationUi.ui.xml
  • ApplicationMenu.java
  • ApplicationMenu.ui.xml
在ApplicationUi.java和UI XML中,根目录绑定到DockLayoutPanel。ApplicationMenu位于DockLayoutPanel的北段。菜单栏选项将影响中间部分的装饰板

在ApplicationMenu中,如何获取对DeckPanel的引用,以便调用showWidget()交换显示的面板

另外,由于我是新手,欢迎对这段代码提出任何建议或评论。我已经在谷歌上尽了最大努力,但我所寻找的很多东西似乎都不存在

(这是一篇后续文章)

资料来源: ApplicationUi.java

import org.jason.datacenter.client.forms.NewRequirementForm;

public class ApplicationUi extends Composite {

private static final Binder binder = GWT.create(Binder.class);

interface Binder extends UiBinder<Widget, ApplicationUi> {
}

@UiField DockLayoutPanel dlp;
@UiField VerticalSplitPanel headerPanel;
@UiField DeckPanel deckPanel;

public ApplicationUi() {
    initWidget(binder.createAndBindUi(this));

    // add the NewRequirementForm to the deckpanel as index #0
    deckPanel.add(new NewRequirementForm());
}

public void switchDeck(int newIndex) {
    deckPanel.showWidget(newIndex);
}
}
import org.jason.datacenter.client.forms.NewRequirementForm;
公共类ApplicationUi扩展了复合{
私有静态最终绑定器Binder=GWT.create(Binder.class);
接口活页夹扩展了UiBinder{
}
@UiField DockLayoutPanel dlp;
@UiField垂直拆分面板头部面板;
@UiField面板;
公共应用程序i(){
initWidget(binder.createAndBindUi(this));
//将新的RequirementForm作为索引#0添加到甲板面板
deckPanel.add(新的NewRequirementForm());
}
公共无效开关台(int NEWDINDEX){
deckPanel.showWidget(newIndex);
}
}
ApplicationUi.ui.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'  xmlns:g='urn:import:com.google.gwt.user.client.ui'>
<ui:style>
    .panel {
        background-color: ivory;
    }
</ui:style>


<g:DockLayoutPanel ui:field="dlp">
    <g:north size="800">
        <g:VerticalSplitPanel ui:field="headerPanel">

        </g:VerticalSplitPanel>
    </g:north>
    <g:center>
        <g:DeckPanel ui:field="deckPanel" />
    </g:center>
</g:DockLayoutPanel>

</ui:UiBinder>

.小组{
背景颜色:象牙色;
}
ApplicationMenu.java:

public class ApplicationMenu extends Composite {

private static final Binder binder = GWT.create(Binder.class);

interface Binder extends UiBinder<Widget, ApplicationMenu> {
}

@UiField MenuBar applicationMenu;
@UiField MenuItem mitmNewPower;

public ApplicationMenu() {
    initWidget(binder.createAndBindUi(this));

    mitmNewPower.setCommand(new Command() {

        @Override
        public void execute() {
            RootLayoutPanel rlp = RootLayoutPanel.get();
            DockLayoutPanel dlp = (DockLayoutPanel) rlp.getWidget(0);

        }
    });
}
公共类应用程序菜单扩展了复合{
私有静态最终绑定器Binder=GWT.create(Binder.class);
接口活页夹扩展了UiBinder{
}
@UiField菜单栏应用程序菜单;
@UiField MenuItem mitmNewPower;
公共应用程序菜单(){
initWidget(binder.createAndBindUi(this));
setCommand(新命令(){
@凌驾
public void execute(){
RootLayoutPanel rlp=RootLayoutPanel.get();
DockLayoutPanel dlp=(DockLayoutPanel)rlp.getWidget(0);
}
});
}
}

ApplicationMenu.ui.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'>
<ui:style>
    .panel {
        background-color: ivory;
    }
</ui:style>

<g:MenuBar ui:field="applicationMenu">
    <g:MenuItem>
        Process
        <g:MenuBar>
            <g:MenuItem ui:field="mitmNewPower" />
        </g:MenuBar>
    </g:MenuItem>

</g:MenuBar>

</ui:UiBinder>

.小组{
背景颜色:象牙色;
}
过程

实现这一点的一种方法是使用。创建一个事件类型,并让您的
应用程序菜单在单击菜单项时触发该类型的事件。
ApplicationUi
对象可以订阅该事件,并通过更新
DeckPanel
的内容来响应该事件。这就避免了菜单对象需要了解
DeckPanel

不久前,我写了一篇关于在GWT中使用MVP的长篇回答,使用其中的一些想法可以帮助您实现您想要做的事情。