Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从Wicket组件中删除CSS类?_Java_Css_Wicket - Fatal编程技术网

Java 如何从Wicket组件中删除CSS类?

Java 如何从Wicket组件中删除CSS类?,java,css,wicket,Java,Css,Wicket,在Java代码中,使用一个 但如何删除CSS类? 通过完全清除class属性,可以轻松删除所有CSS类: component.add(new SimpleAttributeModifier("class", "")); …但如果组件具有其他您不希望删除的CSS类,则这是不可接受的 Wicket 1.4(但也可以随意发布针对更高版本的建议)。我想到了一种方法: public class CssClassRemover extends AttributeModifier { public

在Java代码中,使用一个

但如何删除CSS类?

通过完全清除class属性,可以轻松删除所有CSS类:

component.add(new SimpleAttributeModifier("class", ""));
…但如果组件具有其他您不希望删除的CSS类,则这是不可接受的


Wicket 1.4(但也可以随意发布针对更高版本的建议)。

我想到了一种方法:

public class CssClassRemover extends AttributeModifier {
    public CssClassRemover(String cssClass) {
        super("class", false, new Model<String>(cssClass));
    }

    @Override
    protected String newValue(String currentValue, String valueToRemove) {
        // NB: naive approach; breaks with e.g. "foo foo-bar" & "foo"
        return currentValue.replaceAll(valueToRemove, "");
    }
}
(当然,您也可以根据需要创建匿名AttributeModifier子类,但将逻辑放在单独的实用程序类或方法中会使其更干净。)

Edit:一个改进版的
newValue()
可以更好地处理角落案例(参见biziclop的评论)。注:用途。(欢迎您发布更简单(regex?)的版本。)

@覆盖
受保护的字符串newValue(字符串currentValue、字符串valueToRemove){
如果(currentValue==null)返回“”;
Set classes=Sets.newHashSet(Splitter.on(“”).split(currentValue));
类。删除(值删除);
返回Joiner.on(“”).join(类);
}

< /代码> WIKET 1.5 +具有org .Apache .WICET.AtditMedioTysExoReVIEW(

Buffon),下面添加否定的前瞻,以忽略不同样式类中间的忽略(不区分大小写)。

测试输入:

请随意发布更好/更简单的方法。特别是如果我忽略了Wicket内置的类似内容…根据用例,它也可能适合使用
AttributeModifier
,并决定在
IModel
中使用哪些类。您应该添加空格(和字符串开始/结束)与 ValueToReMoo> <代码>的开始和结束相匹配,只需考虑<代码>类=“fo-fo bar”< /C> >如果使用 CurrutalValue.Seple(“\s+”),以获得所有单独的类,然后在没有要删除的类的情况下重新添加它们。为了获得额外的积分,您还可以对
valueToRemove
执行相同的操作,以便能够使用单个
cssclasslover
@biziclop:Good call删除多个类!我不太喜欢正则表达式的细节,所以我很快编写了一个番石榴版本,它应该非常健壮。如果有人不喜欢它,欢迎竞争性的实现。:-)嗯,如果你用的是番石榴,那很简单。:)没用,呃-想详细说明一下吗?(对我自己和其他人来说)在这里记录Wicket的非显而易见的方面是有用的,所以。嗯,看看javadoc(“创建一个属性修饰符,删除一个具有指定名称的属性”),它似乎并没有达到我想要的效果。。。听起来它会完全删除“class”属性,就像问题中的SimpleAttributeModifier示例一样。
component.add(new SimpleAttributeModifier("class", ""));
public class CssClassRemover extends AttributeModifier {
    public CssClassRemover(String cssClass) {
        super("class", false, new Model<String>(cssClass));
    }

    @Override
    protected String newValue(String currentValue, String valueToRemove) {
        // NB: naive approach; breaks with e.g. "foo foo-bar" & "foo"
        return currentValue.replaceAll(valueToRemove, "");
    }
}
component.add(new CssClassRemover("foo"))
@Override
protected String newValue(String currentValue, String valueToRemove) {
    if (currentValue == null) return "";

    Set<String> classes = Sets.newHashSet(Splitter.on(" ").split(currentValue));
    classes.remove(valueToRemove);
    return Joiner.on(" ").join(classes); 
}
public class StyleClassRemover extends AttributeModifier {

    public StyleClassRemover(final String cssClass) {
        super("class", false, Model.of(cssClass));
    }

    @Override
    protected String newValue(final String currentValue, final String valueToRemove) {
        if (currentValue == null) {
            return "";
        }

        final String patternString = "(^|\\s+)" + Pattern.quote(valueToRemove) + "(?!\\S)";
        return Pattern.compile(patternString, Pattern.CASE_INSENSITIVE).matcher(currentValue).replaceAll("");
    }
}