0

GWT アプリの CellTree を作成しようとしていますが、Showcase の初期化中に [つまり onModuleLoad ] 次のエラーが発生します。私がやろうとしているのは、GWT Showcaseアプリを複製してゼロから構築することだけです。

17:47:04.519 [ERROR] [ChannelView] Failed to create an instance of 
'com.app.capture.client.ClientFactory' via deferred binding 
java.lang.IllegalStateException: TreeNode no longer exists.
at com.google.gwt.user.cellview.client.CellTreeNodeView$TreeNodeImpl.assertNotDestroyed(CellTreeNodeView.java:653)
at com.google.gwt.user.cellview.client.CellTreeNodeView$TreeNodeImpl.setChildOpen(CellTreeNodeView.java:642)
at com.google.gwt.user.cellview.client.CellTreeNodeView$TreeNodeImpl.setChildOpen(CellTreeNodeView.java:637)
at com.app.capture.client.ui.MainMenuViewImpl.<init>(MainMenuViewImpl.java:35)
at com.app.capture.client.ClientFactory.<clinit>(ClientFactory.java:13)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.google.gwt.dev.shell.ModuleSpace.loadClassFromSourceName(ModuleSpace.java:665)
at com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:468)
at com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:49)
at com.google.gwt.core.shared.GWT.create(GWT.java:57)
at com.google.gwt.core.client.GWT.create(GWT.java:85)
at com.app.capture.client.ChannelViewEntryPoint.onModuleLoad(ChannelViewEntryPoint.java:59)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:406)
at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:200)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:526)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Thread.java:722)

UI は、縦に並べて配置された 2 つのパネルで構成されています。左側は、セルツリーを追加するナビゲーション パネルです。

セルツリー ビュー モデル クラスは

package com.app.capture.client.ui.model;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.view.client.TreeViewModel;

public class MainMenuViewModel implements TreeViewModel {

private static class Category {
    private final String       name;
    private final List<String> items = new ArrayList<String>();

    public Category(final String name) {
        this.name = name;
    }

    public List<String> getItems() {
        return this.items;
    }

    public String getName() {
        return this.name;
    }

    public void addCategoryItem(String item) {
        items.add(item);
    }
}

private final List<Category>               categories;
private final SingleSelectionModel<String> selectionModel = new SingleSelectionModel<String>();

public MainMenuViewModel() {
    categories = new ArrayList<Category>();

    Category apg = new Category("A");
    apg.addCategoryItem("11");
    apg.addCategoryItem("22");

    Category channel = new Category("B");
    channel.addCategoryItem("33");
    channel.addCategoryItem("44");
    channel.addCategoryItem("55");

    categories.add(apg);
    categories.add(channel);
}

@Override
public <T> NodeInfo<?> getNodeInfo(T value) {
    if (value == null) {
        // Root Level
        ListDataProvider<Category> dataProvider = new ListDataProvider<Category>(categories);
        Cell<Category> cell = new AbstractCell<Category>() {
            @Override
            public void render(com.google.gwt.cell.client.Cell.Context context, Category value, SafeHtmlBuilder sb) {
                if (value != null) {
                    sb.appendEscaped(value.getName());
                }
            }
        };
        return new DefaultNodeInfo<Category>(dataProvider, cell);
    } else if (value instanceof Category) {
        ListDataProvider<String> dataProvider = new ListDataProvider<String>(((Category) value).getItems());            
        return new DefaultNodeInfo<String>(dataProvider, new TextCell(), selectionModel, null);
    }
    return null;
}

@Override
public boolean isLeaf(Object value) {
    if (value instanceof String) {
        return true;
    }
    return false;
}

}

メインメニュービューの私のクラス定義は

public class MainMenuViewImpl extends Composite implements MainMenuView {

interface MainMenuViewImplUiBinder extends UiBinder<Widget, MainMenuViewImpl> {
}

private static MainMenuViewImplUiBinder uiBinder = GWT.create(MainMenuViewImplUiBinder.class);

private Presenter                       presenter;

@UiField(provided = true)
CellTree                                mainMenu;

private MainMenuViewModel mainMenuModel;

public MainMenuViewImpl() {
    mainMenuModel = new MainMenuViewModel();
    mainMenu = new CellTree(mainMenuModel, null);
    mainMenu.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
    TreeNode treeNode = mainMenu.getRootTreeNode();
    // This is where the exception is throw. If i remove the following line, no menu is displayed
    treeNode.setChildOpen(0, true);
    initWidget(uiBinder.createAndBindUi(this));

}

@Override
public void setPresenter(Presenter presenter) {
    this.presenter = presenter;
}

}

メインメニューの私の UI バインダー定義は

<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui"
xmlns:c="urn:import:com.google.gwt.user.cellview.client">
<ui:style>
    .mainMenu {
        background-color: #d7dde8;
        border: 1px solid #c3c3c3;
    }
</ui:style>

<g:VerticalPanel styleName="{style.mainMenu}">
    <c:CellTree ui:field="mainMenu" />      
</g:VerticalPanel>
</ui:UiBinder> 

GWT 2.5.0 を使用しています。

この問題をデバッグするためのヘルプ/ポインタは大歓迎です。

4

2 に答える 2

0

これを参照する人にとって、コードに問題はありません。この問題はEclipseに関係していると思います。

今日(この質問を投稿した翌日)、次の手順を実行しました。

  1. エクリプスを再起動する
  2. プロジェクトでの GWT コンパイル
  3. プロジェクトを実行します。

これで私の問題は解決しました。

于 2013-02-16T01:08:26.723 に答える
0

「initWidget」メソッドを配置する必要があります

initWidget(uiBinder.createAndBindUi(this));

ビューコンストラクターの最初の行に。
コンストラクタは次のようになります。

public MainMenuViewImpl() 
{
  initWidget(uiBinder.createAndBindUi(this));
  mainMenuModel = new MainMenuViewModel();
  mainMenu = new CellTree(mainMenuModel, null);
  mainMenu.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
  TreeNode treeNode = mainMenu.getRootTreeNode();
  // This is where the exception is throw. If i remove the following line, no menu is displayed
  treeNode.setChildOpen(0, true);
}

;)

于 2014-01-02T11:02:18.757 に答える