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())?
前もって感謝します...
ナイジェル