如何在onClick()中禁用/更改wicket按钮链接的样式

时间:2011-05-07 13:25:57

标签: java wicket

在Wicket应用程序中,我有一堆<button>元素,我正在攻击Link组件。现在在组件的onClick()方法中我想禁用或更改按钮的样式。我怎样才能做到这一点?致电setEnabled(false)无效。

6 个答案:

答案 0 :(得分:9)

onClick()的重复使用正在内存中的同一对象上运行。如果您没有使用Ajax,您仍然可以在Link的匿名子类中维护某些状态。然后,您可以使用onBeforeRender()和onComponentTag()来更改每次显示的方式。

Link<Void> link = new Link<Void>("myLink") {

    private String customCSS = null;
    private boolean customEnabled = true;

    public void onClick() {
        if (/* test to determine disabled */) {
            customCSS = "disabled";
            customEnabled = false;
        } else {
            customCSS = null;
            customEnabled = true;
        }
    }

    @Override
    protected void onComponentTag(ComponentTag tag) {
        super.onComponentTag(tag);
        if (customCSS != null)
            tag.put("class", customCSS);
    }

    @Override
    public boolean isEnabled() {
        return super.isEnabled() && customEnabled;
    }
};

AttributeModifiers(或其他行为)对于这种情况并不好,因为如果你在onClick()方法中添加它们,它们将在每次点击的同一链接上开始堆叠 - 因为它们是作为Link的一部分进行维护的状态。

您的链接可以跟踪所有状态,允许您的onClick()方法通过重复点击启用/禁用/更改/等。

您还可以覆盖onBeforeRender(),isVisible()以及每次在页面上显示链接时运行的其他方法。无论您单击按钮多少次,构造函数,onConfigure()和其他只运行一次。

答案 1 :(得分:3)

我不认为这在Wicket中是一个完全好主意。当然它可以通过欺骗来完成,但它要么简单得多:

  1. 重写isEnabled()方法以返回从表单/组件模型派生的值。
  2. 创建组件时附加AttributeModifier,并使用模型返回上面派生的值。
  3. 无论你选择哪个,原则是让Wicket“拉”渲染信息而不是明确地推送它。

答案 2 :(得分:2)

Michael Borgwardt提供的答案几乎是正确的。

  

问题是您使用链接。已禁用的链接使用<span>代替    <a>/<button>,默认情况下被<em>包围。使用Button   组件将设置&#39;禁用&#39;元素中的属性。

我想补充一点,您需要使用HTML按钮元素而不是<a>(链接)。原始答案可以是反驳,因为链接和按钮也存在于Wicket中。

答案 3 :(得分:0)

我认为AjaxCallDecorator应该是您需要用来禁用/更改按钮样式的类。

答案 4 :(得分:0)

查看SimpleAttributeModifierAttributeAppender。根据您的实际要求,其中一个应该可以解决问题。 SimpleAttributeModifier添加或替换任何在wicket中具有预表示的HTML-Tag的属性(替换css类),而AttributeAppender附加到属性(添加另一个css类)。这应该适用于启用/禁用按钮,但我没有尝试过。

示例:

Label label = new Label("id", "Some silly text.")
add(label);
label.add(new SimpleAttributeModifier("class", "my-css-class");

对于Ajax,您还必须将组件添加到目标。

更详细的例子:

Java代码:

import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.Model;

public class DemoPage extends WebPage {

    public DemoPage() {
        Form form = new Form("form");
        add(form);
        final WebMarkupContainer wmc = new WebMarkupContainer("greenText");
        form.add(wmc);
        form.add(new Link("redLink"){

            @Override
            public void onClick() {
                wmc.add(new SimpleAttributeModifier("class", "redText"));
            }});
        final Button boldButton = new Button("boldButton"){

            @Override
            public void onSubmit() {
                wmc.add(new AttributeAppender("class", true, new Model<String>("boldText"), " "));
            }};
        form.add(boldButton);
        Link disabler = new Link("buttonDisabler") {

            @Override
            public void onClick() {
                boldButton.add(new AttributeAppender("disabled", true, new Model<String>("disabled"), " "));                
            }

        };
        form.add(disabler);
    }

}

相应的HTML:

<html>
<head>
<style>
.redText {
    color: red;
    }
.greenText {
    color: green;
    }
.boldText {
    font-weight: bold;
    }
</style>
</head>
<body>
<form wicket:id="form">
<div class="greenText" wicket:id="greenText">This is Green.</div><br />
<a href="" wicket:id="redLink">Make it red</a><br />
<input type="submit" wicket:id="boldButton" value="Make it bold" /><br />
<a href="" wicket:id="buttonDisabler">Disable the button</a>
</form>
</body>
</html>

答案 5 :(得分:0)

问题是您使用链接。已禁用的链接使用<span>代替<a>/<button>,默认情况下会被<em>包围。 使用Button组件将在元素中设置'disabled'属性。