0

このモデルに従って、MVPアーキテクチャを使用してGWTとのインターフェイスの開発を開始します。

  • TabLayoutPanelをインスタンス化する最初のビューは、最初のタブのウィジェットと空の2番目のタブを定義します。
  • 2番目のタブのonSelectionTabLayoutPanel全体を2番目のタブのウィジェットを定義する2番目のビューに送信するイベントを発生させます。

2番目のビューで適切なTabLayoutPanelを受け取りましたが、2番目のタブを取得して変更を加え、古いパネルに挿入すると、「このウィジェットの親はHasWidgetsを実装していません」というメッセージが表示され、2番目のタブが消えます。

ここで本当の問題が何であるか、またはそれ以外の方法でそれを行う方法を理解するのを手伝ってくれてありがとう。

コメント付きの2番目のビューコードを追加しました。

public class MDP2View extends Composite implements MDP2Presenter.Display {

    private final TabLayoutPanel tabPanel;
    private final VerticalPanel MDP2;
    private final Label label;

    public MDP2View(HasSelectionHandlers<Integer> tabPanel) {
            // Getting the TabLayoutPanel created on the first View  
        this.tabPanel = (TabLayoutPanel) tabPanel;
            // Getting the second Tab (this will remove the Tab from the TabLayoutPanel)
        MDP2 = (VerticalPanel) this.tabPanel.getWidget(1); 
        initWidget(MDP2);
            // Adding a label to the Tab
        label = new Label();
        label.setText("onSelectionHandler Works!!!");
        MDP2.add(label);
            // Inserting the Tab in the tabPanel
        this.tabPanel.insert(MDP2, "MDP2", 1);
}
4

2 に答える 2

0

この問題は、コンストラクターのウィジェットを親に追加したときに始まりました。その結果、コードにこのバグが発生しました。まずMDP2、を呼び出して、ウィジェットを新しい親MDP2ViewにアタッチしますinitWidgetMDP2Viewはの新しい親ですMDP2(現在、tabPanelから削除されているため)。次に、挿入にビューを挿入するつもりですが、代わりにウィジェットの子のみを挿入しますMDP2。insertはメソッドを介してMDP2親から暗黙的に削除しようとし、の子ウィジェットは許可されないため、エラーがスローされます。私が正しければ、これでうまくいくはずです。MDP2ViewremoveParentMDP2Viewthis.tabPanel.insert(this, "MDP2", 1);

ただし、このコンストラクターからtabPanelとの相互作用を削除し、それをたとえばselectionHandlerの実装に移動することをお勧めします。それはあなたの見方をずっときれいにするでしょう。このコードは、将来のバグを待っています。TabLayoutPanelにキャストし、VerticalPanelにキャストします。そのウィジェットを変更すると、ランタイムエラーが発生します。ハードコードされた位置での取得と挿入1; 1の前にタブを追加するとどうなりますか。コードは正しく動作しません。

于 2012-05-15T18:55:39.863 に答える
0

既存のウィジェット(ここ)で参照を取得せずにMDP2オブジェクトを作成する必要があると思いますthis.tabPanel.getWidget(1)。次に、新しいMDP2をに挿入しtabpanel#1ます。

何かのようなもの:

MDP2 = initWidget(new VerticalPanel()); 
// Adding a label to the Tab
label = new Label();
label.setText("onSelectionHandler Works!!!");
MDP2.add(label);
// Inserting the Tab in the tabPanel
this.tabPanel.insert(MDP2, "MDP2", 1);

すでに存在するものでメソッド「init」を呼び出すのは危険かもしれないと思います:)

于 2012-06-15T23:58:49.890 に答える