3

JavaとApacheWicket1.5で問題が発生し、2つの匿名クラスを囲むJavaオブジェクトのIDが変更されました。

1つのWicketモーダルウィンドウ内で、2番目のモーダルウィンドウ(テキスト文字列プロンプトを取得するため)を作成してから、モデルのAJAX更新(文字列と整数のペアのリスト)で元のモーダルウィンドウを更新します。

基本的に、同じメソッドで2つの匿名クラスを作成しましたが、囲んでいるインスタンスの「this」ポインターは、一方の匿名クラスともう一方の匿名クラスで異なります。

これは私には通常の予想されるJVMの動作のようには見えませんが、Java仕様でもこれがどのように機能するかについての詳細を見つけることができませんでした。

public class DropDownChoiceModal extends WebPage {

    public String newTermResponse;

    private void addAddTermModal() {
        addTermModal = new ModalWindow("add_term_modal");
        addTermModal.setPageCreator(new ModalWindow.PageCreator() {
            public Page createPage() {
                PropertyModel pm = new PropertyModel<String>(DropDownChoiceModal.this, "newTermResponse"); 
                System.out.println ("propModel: " + System.identityHashCode(DropDownChoiceModal.this)); 
                return new TextInputModal(addTermModal, "What is the new term you wish to add?", pm);
            }
        });

        addTermModal.setWindowClosedCallback(new WindowClosedCallback() {
        public void onClose(AjaxRequestTarget target) {

            System.out.println ("propModel: " + System.identityHashCode(DropDownChoiceModal.this)); 
            System.out.println ("newTermResponse: " + DropDownChoiceModal.this.newTermResponse);

            // If the value is set then use it 
            if (newTermAvailable()) {

                // Add the new term to the model
                model.add(new StringIntegerPair (newTermResponse, 0));

                System.out.println ("Update view: " + model.size());

                // Update the view
                target.add(wmc);
            }
            System.out.println ("No new term");
        }

        private boolean newTermAvailable() {
            return (newTermResponse != null) && !newTermResponse.isEmpty();
        }
    });

    add(addTermModal);
    }

TextInputModalクラスの場合:

public class TextInputModal extends WebPage {

public TextInputModal(final ModalWindow modal, String requestString, final IModel<?> model) {
    Form<String> form = new Form<String>("form") {
        public void onSubmit() {
            System.out.println ("Submitted: " + System.identityHashCode(((PropertyModel)model).getTarget()) + "; " + model.getObject());
        }
    };

    // Add the buttons
    form.add(new AjaxButton("ok") {
        public void onAfterSubmit(AjaxRequestTarget target, Form<?> form) {
            System.out.println ("Submitted 2: " + System.identityHashCode(((PropertyModel)model).getTarget()) + "; " + model.getObject());
            modal.close(target);
        }
    });

    // Add the form
    add(form);
}
}

私が得る出力:

propModel: 698650686
Submitted: 698650686; fdsfds
Submitted 2: 698650686; fdsfds
propModel: 1447892364
newTermResponse: null
No new term

同じメソッドで作成されたときに、囲んでいるインスタンス(DropDownChoiceModal.this)のIDが匿名クラス1(new ModalWindow.PageCreator(){})と匿名クラス2(new WindowClosedCallback(){})の間で変更された理由(addAddTermModal())?

前もって感謝します...

ナイジェル

4

1 に答える 1

0

上記のコメントのbiziclopに大いに感謝します...シリアル化されているときにWicketがオブジェクトを壊していたようです-「newTermResponse」文字列の内容は、このシリアル化中にどこかで失われていました。

ここで、ネストされたModalWindowの例に戻りました。

http://www.wicket-library.com/wicket-examples/ajax/modal-window

PropertyModelの代わりに例に示すようにgetPageReference()を使用すると、問題が解決しました。

乾杯、

ナイジェル

于 2012-11-01T01:11:15.837 に答える