Java Wicket AjaxButton不更新反馈面板

Java Wicket AjaxButton不更新反馈面板,java,wicket,Java,Wicket,如果单击AjaxButton,我将尝试向Wicket中的反馈面板发送一条成功消息。但我收到以下错误消息: Wicket.Ajax.Call.processComponent:在尝试执行标记更新时,找不到id为[[065DFC0DD1DC5103CC5FFEE61F2AE12]]的组件 我已经知道,在使用AjaxButton并在onSubmit中设置目标之前,我必须在Java代码中输出markupID。我还设置了setOutputMarkupPlaceholderTag一次,但没有任何改变。 我还

如果单击AjaxButton,我将尝试向Wicket中的反馈面板发送一条成功消息。但我收到以下错误消息:

Wicket.Ajax.Call.processComponent:在尝试执行标记更新时,找不到id为[[065DFC0DD1DC5103CC5FFEE61F2AE12]]的组件

我已经知道,在使用AjaxButton并在onSubmit中设置目标之前,我必须在Java代码中输出markupID。我还设置了
setOutputMarkupPlaceholderTag
一次,但没有任何改变。
我还创建了一个小测试页面,成功地将成功消息发送到反馈面板

因此,我开始调试该项目,并发现从
DefaultMarkupIdGenerator.generateMarkupId
返回的markupID确实与HTML中显示的不同。此外,所有反馈面板在ajax调用期间都接收此markupID

反馈面板通12与065DFC0DD1DC51103CC5FFEE61F2AE12

更复杂的是,我的反馈面板位于RepeatingView中,该视图包含在已经包含反馈面板(继承自其超类)的页面中的面板中。结构如下:

Java代码 我的网页

public MyPage extends MySuperPage{

    //Constructors were left out

    //this method is called in the onInitialize of some
    //super class.
    @Override
    protected Component newContent() {
        setFeedbackPanelFilter();
        return new MyContainerPanel();
    }

    //this FeedbackPanel shall not recieve messages from child containers
    private void setFeedbackPanelFilter() {
        ((FeedbackPanel) this.get("feedback"))
            .setFilter( new ContainerFeedbackMessageFilter(this) {
                @Override
                public boolean accept(FeedbackMessage message) {
                    return !super.accept(message);
                }
        });
    }
}
<!DOCTYPE html
 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <body class="BG_MAIN">
           <div class="grid_16 BG1_GLOBAL">
               <div style="margin:10px;">
                   <div class="grid_3 alpha">
                    <wicket:container wicket:id="menu"></wicket:container>
                </div>
            <div class="grid_12 omega">
        <div class="INHALT">
                <h1 wicket:id="appHeader" style="margin-top: 0;"></h1>
                <div wicket:id="wartung" />
                <div wicket:id="feedback"></div>
                <wicket:container wicket:id="content"></wicket:container>
            </div>
        </div>
    </body>
</html>
支原体感染小组

public MyContainerPanel extends Panel {

    //Constructors were left out

    @Override
    protected void onInitialize() {
        super.onInitialize();
        RepeatingView repeater = new RepeatingView("repeater");
        add(repeater);
        for (Object o : objects) {
            String id = repeater.newChildId();
            repeater.add(new MyPanel(id,o));
        }
    }
}
<html xmlns:wicket="http://wicket.apache.org">
    <wicket:panel>
        <div wicket:id="repeater">
        </div>
    </wicket:panel>
</html>
我的小组

public MyPanel extends Panel {    
    private Object o;
    private CheckBox chkBox;
    private DateTimeField startDate, endDate;
    private TextField<String> message;
    private Form<Object> form;
    private AjaxButton button;
    private Label name;
    private FeedbackPanel feedbackPanel;

    //Constructors were left out

    @Override
    protected void onInitialize() {
        super.onInitialize();

        initFields();
        addFields();
        addAjaxButton();
        addAjaxFormComponentUpdatingBehavior();

        if (!o.isMaintenance())
            disableFields();
        }

    private void addAjaxButton() {
        button = new AjaxButton("submit") {
            @Override
            public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                //do something
                feedbackPanel.success("Speichern erfolgreich");
                target.addChildren(AppWartungPanel.this.getPage(), FeedbackPanel.class);
            }
        };
        form.add(button);
    }

    private void addAjaxFormComponentUpdatingBehavior() {
        chkBox.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                switchVisibility();
                target.add(startDate);
                target.add(endDate);
                target.add(message);
                target.add(feedbackPanel);
            }
        });
    }

    private void switchVisibility() {
        if (o.isMaintenance())
            enableFields();
        else
            disableFields();
        }

    private void addFields() {
        add(form);
        form.add(feedbackPanel);
        form.add(chkBox);
        form.add(startDate);
        form.add(endDate);
        form.add(message);
        form.add(name);
    }

    private void initFields() {
        form = new Form<WartungDAO>("form", AppWartungPanel.this.getModel());
        chkBox = new CheckBox("wartung", new PropertyModel<Boolean>(o, "wartung"));
        chkBox.setOutputMarkupId(true);
        startDate = new DateTimeField("startDate", new PropertyModel<Date>(o, "startDate"));
        startDate.setOutputMarkupId(true);
        startDate.setRequired(true);
        endDate = new DateTimeField("endDate", new PropertyModel<Date>(o, "endDate"));
        endDate.setOutputMarkupId(true);
        endDate.setRequired(true);
        message = new TextField<String>("message", new PropertyModel<String>(o, "message"));
        message.setOutputMarkupId(true);
        message.setRequired(true);
        name = new Label("name", new PropertyModel<String>(o, "portal"));
        feedbackPanel = new FeedbackPanel("feedbackPanelWartung");
        feedbackPanel.setOutputMarkupId(true);
        feedbackPanel.setFilter(new ContainerFeedbackMessageFilter(this));
    }

    private void disableFields() {
        startDate.setEnabled(false);
        endDate.setEnabled(false);
        message.setEnabled(false);
    }

    private void enableFields() {
        startDate.setEnabled(true);
        endDate.setEnabled(true);
        message.setEnabled(true);
    }
}
<html xmlns:wicket="http://wicket.apache.org">
    <wicket:panel>
        <div style="margin-left: 25px; margin-top: 25px;">
            <form wicket:id="form">
                <h2 wicket:id="name"></h2>
                <div wicket:id="feedbackPanelWartung"></div>
                <table style="border: none;">
                    <tbody>
                        <tr>
                            <td style="border: none;">Wartung aktiv?</td>
                            <td style="border: none;">
                                <input wicket:id="wartung" type="checkbox" />
                            </td>
                        </tr>
                        <tr>
                            <td style="border: none;">Nachricht zum Anzeigen:</td>
                            <td style="border: none;">
                                <input wicket:id="message" type="text" size="50" />
                            </td>
                        </tr>
                        <tr>
                            <td style="border: none;">Startdatum</td>
                            <td style="border: none;">
                                <div wicket:id="startDate"></div>
                            </td>
                        </tr>
                        <tr>
                            <td style="border: none;">Enddatum</td>
                            <td style="border: none;">
                                <div wicket:id="endDate"></div>
                            </td>
                        </tr>
                        <tr>
                            <td style="border: none;"></td>
                            <td style="border: none;">
                                <input wicket:id="submit" type="submit" value="Speichern" style="float: right;" />
                            </td>
                        </tr>
                    </tbody> 
                </table>
            </form>
        </div>
    </wicket:panel>
</html>
public MyPanel扩展了Panel{
私人客体o;
私有复选框chkBox;
专用日期时间字段开始日期、结束日期;
私有文本字段消息;
私人形式;
私人AjaxButton按钮;
自有品牌名称;
专用反馈面板反馈面板;
//建设者被排除在外
@凌驾
受保护的void onInitialize(){
super.onInitialize();
initFields();
addFields();
addAjaxButton();
AddAjaxFormComponentUpdateingBehavior();
如果(!o.isMaintenance())
禁用字段();
}
私有void addAjaxButton(){
按钮=新的AjaxButton(“提交”){
@凌驾
提交时公共无效(最终AjaxRequestTarget目标,最终表单){
//做点什么
反馈小组。成功(“Speichern erfolgreich”);
target.addChildren(AppWartungPanel.this.getPage(),FeedbackPanel.class);
}
};
表单添加(按钮);
}
私有void addajaxFormComponentUpdateingBehavior(){
添加(新的AjaxFormComponentUpdateBehavior(“onchange”){
@凌驾
受保护的void onUpdate(AjaxRequestTarget目标){
切换可见性();
目标。添加(起始日期);
目标。添加(结束日期);
添加(消息);
添加(反馈面板);
}
});
}
私有虚拟交换机可见性(){
如果(o.isMaintenance())
enableFields();
其他的
禁用字段();
}
私有void addFields(){
添加(表格);
表格.添加(反馈面板);
添加表格(chkBox);
添加表格(起始日期);
表格。添加(截止日期);
表格。添加(消息);
表格.加入(姓名);
}
私有void initFields(){
表单=新表单(“表单”,AppWartungPanel.this.getModel());
chkBox=new复选框(“wartung”,新属性模型(o,“wartung”);
chkBox.setOutputMarkupId(true);
startDate=新日期时间域(“startDate”,新属性模型(o,“startDate”);
startDate.setOutputMarkupId(true);
startDate.setRequired(真);
endDate=新的DateTimeField(“endDate”,新的PropertyModel(o,“endDate”));
endDate.setOutputMarkupId(true);
endDate.setRequired(true);
消息=新文本字段(“消息”,新属性模型(o,“消息”);
message.setOutputMarkupId(true);
message.setRequired(true);
名称=新标签(“名称”,新属性模型(o,“门户”);
反馈面板=新的反馈面板(“反馈面板”);
反馈面板setOutputMarkupId(真);
setFilter(新的ContainerFeedbackMessageFilter(this));
}
私有void disableFields(){
startDate.setEnabled(false);
endDate.setEnabled(false);
message.setEnabled(false);
}
私有void启用字段(){
startDate.setEnabled(真);
endDate.setEnabled(true);
message.setEnabled(true);
}
}
HTML标记 我的网页

public MyPage extends MySuperPage{

    //Constructors were left out

    //this method is called in the onInitialize of some
    //super class.
    @Override
    protected Component newContent() {
        setFeedbackPanelFilter();
        return new MyContainerPanel();
    }

    //this FeedbackPanel shall not recieve messages from child containers
    private void setFeedbackPanelFilter() {
        ((FeedbackPanel) this.get("feedback"))
            .setFilter( new ContainerFeedbackMessageFilter(this) {
                @Override
                public boolean accept(FeedbackMessage message) {
                    return !super.accept(message);
                }
        });
    }
}
<!DOCTYPE html
 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <body class="BG_MAIN">
           <div class="grid_16 BG1_GLOBAL">
               <div style="margin:10px;">
                   <div class="grid_3 alpha">
                    <wicket:container wicket:id="menu"></wicket:container>
                </div>
            <div class="grid_12 omega">
        <div class="INHALT">
                <h1 wicket:id="appHeader" style="margin-top: 0;"></h1>
                <div wicket:id="wartung" />
                <div wicket:id="feedback"></div>
                <wicket:container wicket:id="content"></wicket:container>
            </div>
        </div>
    </body>
</html>

支原体感染小组

public MyContainerPanel extends Panel {

    //Constructors were left out

    @Override
    protected void onInitialize() {
        super.onInitialize();
        RepeatingView repeater = new RepeatingView("repeater");
        add(repeater);
        for (Object o : objects) {
            String id = repeater.newChildId();
            repeater.add(new MyPanel(id,o));
        }
    }
}
<html xmlns:wicket="http://wicket.apache.org">
    <wicket:panel>
        <div wicket:id="repeater">
        </div>
    </wicket:panel>
</html>

我的小组

public MyPanel extends Panel {    
    private Object o;
    private CheckBox chkBox;
    private DateTimeField startDate, endDate;
    private TextField<String> message;
    private Form<Object> form;
    private AjaxButton button;
    private Label name;
    private FeedbackPanel feedbackPanel;

    //Constructors were left out

    @Override
    protected void onInitialize() {
        super.onInitialize();

        initFields();
        addFields();
        addAjaxButton();
        addAjaxFormComponentUpdatingBehavior();

        if (!o.isMaintenance())
            disableFields();
        }

    private void addAjaxButton() {
        button = new AjaxButton("submit") {
            @Override
            public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
                //do something
                feedbackPanel.success("Speichern erfolgreich");
                target.addChildren(AppWartungPanel.this.getPage(), FeedbackPanel.class);
            }
        };
        form.add(button);
    }

    private void addAjaxFormComponentUpdatingBehavior() {
        chkBox.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                switchVisibility();
                target.add(startDate);
                target.add(endDate);
                target.add(message);
                target.add(feedbackPanel);
            }
        });
    }

    private void switchVisibility() {
        if (o.isMaintenance())
            enableFields();
        else
            disableFields();
        }

    private void addFields() {
        add(form);
        form.add(feedbackPanel);
        form.add(chkBox);
        form.add(startDate);
        form.add(endDate);
        form.add(message);
        form.add(name);
    }

    private void initFields() {
        form = new Form<WartungDAO>("form", AppWartungPanel.this.getModel());
        chkBox = new CheckBox("wartung", new PropertyModel<Boolean>(o, "wartung"));
        chkBox.setOutputMarkupId(true);
        startDate = new DateTimeField("startDate", new PropertyModel<Date>(o, "startDate"));
        startDate.setOutputMarkupId(true);
        startDate.setRequired(true);
        endDate = new DateTimeField("endDate", new PropertyModel<Date>(o, "endDate"));
        endDate.setOutputMarkupId(true);
        endDate.setRequired(true);
        message = new TextField<String>("message", new PropertyModel<String>(o, "message"));
        message.setOutputMarkupId(true);
        message.setRequired(true);
        name = new Label("name", new PropertyModel<String>(o, "portal"));
        feedbackPanel = new FeedbackPanel("feedbackPanelWartung");
        feedbackPanel.setOutputMarkupId(true);
        feedbackPanel.setFilter(new ContainerFeedbackMessageFilter(this));
    }

    private void disableFields() {
        startDate.setEnabled(false);
        endDate.setEnabled(false);
        message.setEnabled(false);
    }

    private void enableFields() {
        startDate.setEnabled(true);
        endDate.setEnabled(true);
        message.setEnabled(true);
    }
}
<html xmlns:wicket="http://wicket.apache.org">
    <wicket:panel>
        <div style="margin-left: 25px; margin-top: 25px;">
            <form wicket:id="form">
                <h2 wicket:id="name"></h2>
                <div wicket:id="feedbackPanelWartung"></div>
                <table style="border: none;">
                    <tbody>
                        <tr>
                            <td style="border: none;">Wartung aktiv?</td>
                            <td style="border: none;">
                                <input wicket:id="wartung" type="checkbox" />
                            </td>
                        </tr>
                        <tr>
                            <td style="border: none;">Nachricht zum Anzeigen:</td>
                            <td style="border: none;">
                                <input wicket:id="message" type="text" size="50" />
                            </td>
                        </tr>
                        <tr>
                            <td style="border: none;">Startdatum</td>
                            <td style="border: none;">
                                <div wicket:id="startDate"></div>
                            </td>
                        </tr>
                        <tr>
                            <td style="border: none;">Enddatum</td>
                            <td style="border: none;">
                                <div wicket:id="endDate"></div>
                            </td>
                        </tr>
                        <tr>
                            <td style="border: none;"></td>
                            <td style="border: none;">
                                <input wicket:id="submit" type="submit" value="Speichern" style="float: right;" />
                            </td>
                        </tr>
                    </tbody> 
                </table>
            </form>
        </div>
    </wicket:panel>
</html>

瓦东·阿克提夫?
纳克里赫特·祖姆·安齐根:
Startdatum
端基准
我只能猜测错误是由于页面的复杂性造成的

我还禁用了
AjaxFormComponentUpdateBehavior
,以检查它是否会干扰Aj