2010-11-03 27 views
0

我從檢票1.4.11讀數異常:檢票替換 「僅添加到父組件」

2010-11-03 17:44:51971 [HTTP-8080-1] ERROR的有機apache.wicket.RequestCycle - 針對組件[MarkupContainer [Component id = customer]]的org.apache.wicket.markup.html.form.IFormSubmitListener接口的方法onFormSubmitted拋出異常
org.apache.wicket.WicketRuntimeException:Method onFormSubmitted界面
針對組件[MarkupContainer [Component id = customer]]的org.apache.wicket.markup.html.form.IFormSubmitListener在org.a處拋出異常 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)
...
java.lang.reflect.InvocationTargetException :pache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:193)
...
引起 引起:java.lang.IllegalStateException:只能在已經添加到其父項的組件上調用此方法。
在org.apache.wicket.Component.replaceWith(Component.java:2804)
在no.magge.iumb.web.crm.customers.PrivateCustomerTab $ 1.onSubmit(PrivateCustomerTab.java:34)
的組織。 apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1565)

這發生了,當我在一個tabbedpanel一個tabbedpanel面板單擊窗體的cancel_btn ...這裏是cancel_btn的代碼:

public class PrivateCustomerTab extends Panel { 

private static final long serialVersionUID = 16L; 

protected Panel getCurrentPanel() { 
    return this; 
} 

public PrivateCustomerTab(String id, long customerId, final Panel backPanel) { 
    super(id); 

    final PrivateCustomerForm form = new PrivateCustomerForm("customer", customerId) { 
    private static final long serialVersionUID = 4L; 
    @Override 
    protected void onSubmit() { 
    System.out.println("\n\n(formsubmit) HELLO THERE MY PARENT IS: " + getParent() + "\n\n"); 
    if (customerId!=0) { 
    PrivateCustomerTab.this.replaceWith(new PrivateCustomerTab("panel", customerId, backPanel)); 
    } 
    } 
    }; 
    add(form); 

    Button cancelButton = new Button("cancel_btn", new ResourceModel("cancel")) { 
    private static final long serialVersionUID = 18L; 
    @Override 
    public void onSubmit() { 
    System.out.println("\n\n(cancelsubmit) HELLO THERE MY PARENT IS: " + getParent() + "\n\n"); 
    if (backPanel!=null) { 
    // PrivateCustomerTab.this.replace(backPanel); 
    getCurrentPanel().replaceWith(new CustomerListTab("panel")); 

    } 
    } 
    }; 
    cancelButton.setVisible(backPanel!=null); 
    form.add(cancelButton); 
     } 
} 

我是蜜蜂ñ嘗試各種方式獲取當前面板,我想替換的面板。一種方法是使用從面板類返回thisgetCurrentPanel()方法。另一種方法是做PrivateCustomerTab.this.replaceWith(...),我也試過getParent().getParent().replaceWith(...)。這些都給我的信息,我不能代替沒有添加到其父母的東西。

我想我一定是誤解了這裏的一些關鍵概念。也許窗體在我的面板被添加到其父項之前被處理,這意味着我不能替換面板cancel_btnonSubmit()

我試過Google搜索我的方式,並在我的副本Wicket in Action中尋找相關信息。請幫我理解......謝謝!

回答

1

這不是真的要找到合適的面板。 這似乎是好的。 所有三個調用似乎找到相同的面板。

這是關於,面板本身是否被添加到。爲了用自己的東西取代自己,一個組件需要詢問父母,如果它被添加到其中。 然後,它要求其父母忘記自己,並選擇給定的組件作爲一個孩子。

因此,檢票基本上抱怨面板沒有添加到任何組件。

元件層次是否同時發生變化?

+0

不,層次不應該改變據我所知。我有一個代替replaceWith()的鏈接,並取代了這個PrivateCustomerTab面板。我不改變標記或做任何事情來操縱它和cancel_btn的onSubmit方法之間的層次結構。 – Magnus 2010-11-04 15:56:23

+0

我看到你關於問題的觀點是我的面板現在不知何故沒有父母。所以謝謝你... – Magnus 2010-11-04 15:57:43

+0

標記爲有用。發現問題並在下面發佈答案。再次感謝你的幫助。 – Magnus 2010-11-04 18:25:40

0

想到這一個 - 新手錯誤(再次),我猜。

會發生什麼是在cancel_btnonSubmit()之前調用表格onSubmit()。由於第一個這些方法取代了面板,因此第二次嘗試替換同一個面板時,它不再被添加到父面板中。

爲了解決它,我將我的表格onSubmit()代碼移動到我的保存按鈕onSubmit()。通過這樣做,僅調用1 onSubmit()方法,具體取決於單擊了哪個按鈕。

+1

真的嗎?有多奇怪:「Wicket首先調用按鈕的'onSubmit'方法,然後(如果沒有其他配置)調用窗體的'onSubmit'方法。」 - _Wicket in Action_,p157 – Pops 2010-11-05 23:01:40

+0

奇怪。我會給它另一個調試運行。 – Magnus 2010-11-06 00:15:10