Wicket:在显式禁用整个面板时启用面板组件

时间:2014-01-21 15:33:05

标签: wicket-1.5

目前我有一个小组,其中我有10个文本字段和10个下拉列表。我想禁用面板中的所有组件,除了1个文本字段。目前我正在做的是为面板中的所有组件调用setenabled false,并且仅为1个组件设置enabled true。而不是这样做,我宁愿禁用整个面板并在该面板中仅启用1个特定组件。但这不起作用。在检票口有可能吗?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

查看此界面:IVisitor

visitChildren(new IVisitor<Component, Object>() {
        @Override
        public void component(Component object, IVisit<Object> visit) {
            object.setEnabled(false);
        }
    });

此处visitChildren()是您MarkupContainer所属Panel的函数。

或者创建一个函数:

public static void setEnabled(boolean enabled, Component... components) {
    for (Component component : components) {
        component.setEnabled(enabled);
    }
}

并使用如下:

setEnabled(false, textfield1, textfield2, dropdown1, dropdown2);

答案 1 :(得分:0)

禁用面板并覆盖异常组件的isEnabled()函数以返回true。 /当使用link时,覆盖protected boolean isLinkEnabled()和public boolean canCallListenerInterface(Method方法)!/ 如果你拥有它,尝试它,如果你得到ListenerInvocationNotAllowedException然后检查是什么原因导致它。它写得很好。你也可能得到其他例外,尝试调试它们但我相信所有都是可以解决的。 我的答案是基于Wicket 1.6(达到概念证明),但也可能是1.5的解决方案..

我的特殊组件是DownloadLink。这是一个例子:

DownloadLink documentLink = new DownloadLink("documentLink", getFileModel(question), new PropertyModel<String>(getDefaultModelObject(), "answer.documentName")){
        @Override
        public boolean isEnabled() {
            return true;
        }

        @Override
        protected boolean isLinkEnabled() {
            return true;
        }

        @Override
        public boolean canCallListenerInterface(Method method) {
            return true;
        }
    };