如何禁用或启用一组组件

时间:2013-04-15 09:10:52

标签: jsf primefaces

是否可以一次禁用或启用一组组件。 例如:我想禁用一个完整的Form,而这个Form又有几个InputTexts,Dropdown,..... 我希望能够立即禁用或启用所有这些功能。

怎么做?而不是使用布尔变量并将disable =“#{boolean variable}添加到所有组件。 有没有其他方法可以将所有这些方法放在一个组件中并使其启用或禁用??

4 个答案:

答案 0 :(得分:2)

正如@Kukeltje在类似问题中告诉我的那样:"对于每个jsf的新版本,请检查massAttribute(来自omnifaces)"。

在我意识到我使用自己的代码同时禁用一组组件之前。 这是我的代码,但我建议去#34; massAttribute"如前所述:

public class UtilsPrimefaces { 

/**
 * Disable all the children components
 * @param uiComponentName
 */
public static void disableUIComponent(String uiComponentName) {  
    UIComponent component = FacesContext.getCurrentInstance()  
            .getViewRoot().findComponent(uiComponentName);
    if(component!=null) {
        disableAll(component.getChildren());
    } 
}  

/**
 * Recursive method to disable the list
 * @param components Widget PD list
 */
private static void disableAll(List<UIComponent> components) {  

    for (UIComponent component : components) {  
        logger.info(component.getClass().getTypeName());            

        if (component instanceof InputText) {  
            ((InputText) component).setDisabled(true);

        } else if (component instanceof InputNumber) {  
            ((InputNumber) component).setDisabled(true);

        } else if (component instanceof InputTextarea) {  
            ((InputTextarea) component).setDisabled(true);

        }  else if (component instanceof HtmlInputText) {  
            ((HtmlInputText) component).setDisabled(true);

        }  else if(component instanceof SelectOneMenu) {  
            ((SelectOneMenu) component).setDisabled(true);

        } else if(component instanceof SelectBooleanCheckbox) {  
            ((SelectBooleanCheckbox) component).setDisabled(true);

        } else if(component instanceof CommandButton) {  
            ((CommandButton) component).setDisabled(true);              
        }
        disableAll(component.getChildren());  
    }  
} 

然后你可以在你的bean中使用它。这是一个包含3个scrollPanel并且只想禁用panel1和panel3的页面的示例:

@PostConstruct
public void init() {        
    super.init();        
    Utils.disableUIComponent(":form:panel1");
    Utils.disableUIComponent(":form:panel3");
}

这是指向related question

的链接

答案 1 :(得分:1)

有很多方法可以做到这一点。如果您使用的是primefaces,则可以使用<p:blockUI />组件。您可以自定义&#34;禁用区域&#34;。

的CSS样式

查看官方演示:https://www.primefaces.org/showcase/ui/misc/blockUI.xhtml

答案 2 :(得分:0)

如果你只需要让它们不可点击,也许javascript / jquery就足够了?查看此answer以使用jquery禁用它们。

答案 3 :(得分:0)

我见过几种不同的方法:

抛出SystemEvent时添加disable属性: https://stackoverflow.com/a/15031242/1981358

创建自定义组件以包裹表单字段: https://stackoverflow.com/a/11453029/1981358 https://stackoverflow.com/a/9543826/1981358

正如rags所提到的,如果你需要在客户端事件处理期间限制访问,可以使用PF blockUI。

同样,您可以使用jQuery在页面上插入自己的自定义“玻璃”,这样可以防止任何点击(并且真的会让您的用户烦恼)。