1

有没有办法我可以让几个不同的检票口组件具有相同的 isVisible() 实现

例如,我有具有相同 isVisible 方法的 Labels、TextFields、DropdownChoices 等,但我不会为所有这些类实现自定义类,因为很难维护对代码的更改。

顺便说一句,由于页面的设计,我无法将它们放入 webmarkupcontainer 中。

我希望他们都继承这样的东西。

public class DepositoryFormComponent extends Component
{
public DepositoryFormComponent(String id) {
    super(id);
}

public DepositoryFormComponent(String id, IModel model) {
    super(id, model);
}

public boolean isVisible() {
    return isFormDepositoryType();
}

protected boolean isFormDepositoryType() {
    return getCurrentSelections().getSelectedOwnedAccount().getAssetType() == AssetType.DEPOSITORY;
}

protected CurrentSelections getCurrentSelections() {
    return (CurrentSelections) getSession().getAttribute(CurrentSelections.ATTRIBUTE_NAME);
}

public void onRender(){};

}

4

1 回答 1

2

你有几个选择:

  1. 如果您可以控制标记,并且可以将要控制其可见性的所有组件组合在一个标记中,则可以使用<wicket:enclosure>标记使组件控制整个标记的可见性。请注意,这不会影响页面设计,并且会达到与添加WebMarkupContainer

  2. 您可以IBehavior将计算可见性并调用setVisible(). 如果您不希望将来调用来更改的可见性,Component您也可以调用。也许不完全是覆盖,但我认为如果你不创建自定义组件就不太可能实现覆盖。Component#setVisibilityAllowed()setVisible()ComponentisVisible

    public class VisiblityControlBehavior extends AbstractBehavior { 
    
        private boolean isComponentVisible() { 
            return isFormDepositoryType();
        } 
    
        protected boolean isFormDepositoryType() {
            return getCurrentSelections().getSelectedOwnedAccount().getAssetType() == AssetType.DEPOSITORY;
        }
    
        protected CurrentSelections getCurrentSelections() {
            return (CurrentSelections) getSession().getAttribute(CurrentSelections.ATTRIBUTE_NAME);
        }
    
        @Override 
        public void bind(Component component) { 
            boolean visible = isComponentVisible(); 
            component.setVisible(visible); 
            component.setVisibilityAllowed(visible); 
        } 
    } 
    
于 2012-09-19T08:07:19.857 回答