【问题标题】:GWT: Getting a Reference to a DockLayoutPanel from a MenuBarGWT:从 MenuBar 获取对 DockLayoutPanel 的引用
【发布时间】:2011-02-07 19:21:22
【问题描述】:

我是一个新手,试图使用 MenuBar 来交换 DeckPanel 中显示的面板。

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

  • ApplicationUi.java
  • ApplicationUi.ui.xml
  • ApplicationMenu.java
  • ApplicationMenu.ui.xml

在 ApplicationUi.java 和 UI XML 中,根绑定到 DockLayoutPanel。 ApplicationMenu 位于 DockLayoutPanel 的北部。 MenuBar 选项将影响中心部分的 DeckPanel。

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

另外,由于我是新手,欢迎对此代码提出任何建议或评论。我在 Google 上已尽我所能,但我要找的很多东西似乎并不存在。

(这是Replace GWT DockLayoutPanel Contents的后续行动)。

来源: 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);
}
}

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);

        }
    });
}

}

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>

【问题讨论】:

标签: gwt


【解决方案1】:

您可以这样做的一种方法是使用EventBus。创建一个事件类型并让您的ApplicationMenu 在单击菜单项时触发该类型的事件。 ApplicationUi 对象可以订阅该事件并通过更新DeckPanel 的内容来响应它。这完全避免了菜单对象需要了解DeckPanel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多