0

gwt プラットフォームのポップアップ パネルを使用して います。ポップアップには、トップ パネルに 2 つのパネルがあり、いくつかのテキスト ボックスと検索ボタンがあります。

2番目のパネルには、ポップアップが表示されるとすぐにデータベースからデータを自動的にロードするセルテーブルが含まれています。トップパネルからも、特定のデータを検索してセルテーブルを更新できるはずです。次のコードを使用して CellTable を更新しています

public void update(List<UserData> data){
        dataProvider.getList().clear();
        List<UserData> dataList=dataProvider.getList();
        for (UserData rtaData : data) {
            dataList.add(rtaData);
        }
        dataProvider.addDataDisplay(cellTable);     
    }

私のコードは正常に動作していますが、Eclipse で gwt 開発モード ウィンドウを表示すると、検索ボタンをクリックするたびに次のエラーが表示されます。

14:46:25.796 [ERROR] [gwtemotor] Uncaught exception escaped

    java.lang.IllegalStateException: The specified display has already been added to this adapter.
        at com.google.gwt.view.client.AbstractDataProvider.addDataDisplay(AbstractDataProvider.java:83)
        at com.bagi.emotor.client.ui.presenter.RTOLocationView.update(RTOLocationView.java:230)
        at com.bagi.emotor.client.ui.presenter.RTOLocationPresenter$2.onSuccess(RTOLocationPresenter.java:85)
        at com.bagi.emotor.client.ui.presenter.RTOLocationPresenter$2.onSuccess(RTOLocationPresenter.java:1)
        at com.gwtplatform.dispatch.client.DefaultDispatchAsync.onExecuteSuccess(DefaultDispatchAsync.java:229)
        at com.gwtplatform.dispatch.client.DefaultDispatchAsync$2.onSuccess(DefaultDispatchAsync.java:137)
        at com.gwtplatform.dispatch.client.DefaultDispatchAsync$2.onSuccess(DefaultDispatchAsync.java:1)
        at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:232)
        at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
        at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
        at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
        at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
        at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
        at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
        at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
        at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
        at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
        at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
        at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
        at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
        at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
        at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
        at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
        at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
        at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
        at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
        at java.lang.Thread.run(Unknown Source)

アプリは動作していますが、このエラーが発生する理由を理解する必要があります。

ありがとう、

4

2 に答える 2

0

の呼び出しdataProvider.addDataDisplay(cellTable); ごとに呼び出していますupdate(List<UserData> data) 。addDataDisplay は、ビューごとに 1 回だけ呼び出す必要があります。

複数のビューがある場合、mvp の方法は

View 1 -> cellTable
View 2 -> cellTree
Presenter -> dataProvider

dataProvider.addDataDisplay(cellTable) 
dataProvider.addDataDisplay(cellTree) 

解決

コンストラクターに移動dataProvider.addDataDisplayするか、遅延初期化しますupdate(List<UserData> data);

boolean initialized = false;

public void update(List<UserData> data){
        dataProvider.getList().clear();
        if(!initialized) {
          dataProvider.addDataDisplay(cellTable);
          initialized = true;
        } 
        List<UserData> dataList=dataProvider.getList();
        for (UserData rtaData : data) {
            dataList.add(rtaData);
        }

    }
于 2013-01-07T09:48:46.763 に答える
0

このステートメントdataProvider.addDataDisplay(cellTable)は、このアダプターにデータ表示を追加します。ディスプレイの現在の対象範囲にデータが入力されます。

データ表示が既に追加されていて、これを再度追加しようとすると、このエラーがスローされます。

このエラーを回避するには、同じデータ表示を追加する前に、状態を確認して追加表示を削除します。すなわち:

if (getProvider().getDataDisplays().contains(cellTable)) {
            getProvider().removeDataDisplay(cellTable);
   }
getProvider().addDataDisplay(cellTable);
于 2013-01-07T09:48:54.087 に答える