Java 如何在ZK中自定义组件标签

Java 如何在ZK中自定义组件标签,java,zk,Java,Zk,Haii我需要帮助,我想在zk中自定义标签组件,我需要添加一个属性,当我设置mandatory=“true”时,该属性是必填属性,此时将显示星号,如果我设置mandatory=“false”,星号将消失,我正在这样尝试: private Label label; private Label sign; private String lblValue; private String REQUIRED_SIGN = " *"; private boolean mand

Haii我需要帮助,我想在zk中自定义标签组件,我需要添加一个属性,当我设置mandatory=“true”时,该属性是必填属性,此时将显示星号,如果我设置mandatory=“false”,星号将消失,我正在这样尝试:

private Label label;
    private Label sign;
    private String lblValue;
    private String REQUIRED_SIGN = " *";
    private boolean mandatory;


    public SignLabelCustom() 
        {
        label = new Label();
        label.setSclass("form-label");
        appendChild(label);
        sign = new Label();
        if(mandatory=true){
         sign.setValue(REQUIRED_SIGN);   
         sign.setStyle("color: red");
         appendChild(sign); 
        }
        else{
         sign.setValue("");   
         sign.setStyle("color: red");
        removeChild(sign); 
        }

    }

    public String getValue() {
        return lblValue;
    }

    public boolean isMandatory() {
        return mandatory;
    }

    public void setMandatory(boolean mandatory) {
        this.mandatory = mandatory;
    }



    public void setValue(String lblValue) {
        label.setValue(lblValue);
        this.lblValue = lblValue;
    }

但是这个条件不起作用,怎么解决呢?

你可能想要的是一个HtmlMacroComponent,它结合了一个标签和一个文本框

从zul文件开始:

<zk>
<label id="mcLabel"/><textbox id="mcTextbox"/>
</zk>
…现在您可以使用它,例如在zul文件顶部定义它。。。(根据需要调整包和.zul名称):


…所以你可以简单地使用它

<mytextbox id="name" value="Frank N. Furter" caption="Your name" mandatory="true"/>

以后你可以为它定义一个语言插件

public class MyTextbox extends HtmlMacroComponent {

    @Wire("#mcTextbox")
    private Textbox textbox;

    @Wire("#mcLabel")
    private Label label;

    private String caption;

    private boolean mandatory;

    public MyTextbox() {
        compose(); // this wires the whole thing
    }

    public void setMandatory(final boolean value) {
        mandatory = value;
        updateCaption();
    }

    public boolean isMandatory() {
        return mandatory;
    }

    public void setCaption(final String value) {
        caption = value;
        updateCaption();
    }

    public String getCaption() {
        return caption;
    }

    protected void updateCaption() {
        label.setValue(mandatory ? caption + "*" : caption);
    }

    public String getValue() {
        return textbox.getValue();
    }

    public void setValue(final String value) {
        textbox.setValue(value);
    }

}
我的语言插件 xul/html 我的文本框 com.example.MyTextbox /zk/textbox.zul

…这样,您就不需要再将定义放在每个使用它的.zul文件的顶部。有关这方面的更多信息,请参阅


当然,您也只能创建一个新标签等。但我发现为那些组合了各种组件的作业创建宏组件是一个好主意,因为这样,例如,您还可以自动添加验证等。

您可能需要的是一个HtmlMacroComponent,它结合了标签和文本框

从zul文件开始:

<zk>
<label id="mcLabel"/><textbox id="mcTextbox"/>
</zk>
…现在您可以使用它,例如在zul文件顶部定义它。。。(根据需要调整包和.zul名称):


…所以你可以简单地使用它

<mytextbox id="name" value="Frank N. Furter" caption="Your name" mandatory="true"/>

以后你可以为它定义一个语言插件

public class MyTextbox extends HtmlMacroComponent {

    @Wire("#mcTextbox")
    private Textbox textbox;

    @Wire("#mcLabel")
    private Label label;

    private String caption;

    private boolean mandatory;

    public MyTextbox() {
        compose(); // this wires the whole thing
    }

    public void setMandatory(final boolean value) {
        mandatory = value;
        updateCaption();
    }

    public boolean isMandatory() {
        return mandatory;
    }

    public void setCaption(final String value) {
        caption = value;
        updateCaption();
    }

    public String getCaption() {
        return caption;
    }

    protected void updateCaption() {
        label.setValue(mandatory ? caption + "*" : caption);
    }

    public String getValue() {
        return textbox.getValue();
    }

    public void setValue(final String value) {
        textbox.setValue(value);
    }

}
我的语言插件 xul/html 我的文本框 com.example.MyTextbox /zk/textbox.zul

…这样,您就不需要再将定义放在每个使用它的.zul文件的顶部。有关这方面的更多信息,请参阅


当然,您也只能创建一个新标签等。但我发现为那些组合了各种组件的作业创建宏组件是一个好主意,因为这样,例如,您还可以自动添加验证等。

很抱歉,回复太晚了,如果我同意您的建议,这意味着我必须在zk.xml中添加插件标记,我不需要像下面的例子那样将定义放在每个.zul文件的顶部:
,但是如果我喜欢添加上面的标记,我应该需要在我的zk.xml中添加标记插件吗?如果您将此标记添加到需要它的.zul文件中没有问题,您当然可以这样做。在这种情况下,不需要做进一步的操作,也不需要语言插件。我想这主要是一个品味问题。好吧,现在我将尝试将您的示例类
MyTextbox
添加到我的项目中,并尝试在我的zul中像这样导入
,而不使用
macroURI=“/zk/textbox.zul”
,因为我没有创建任何文件来定义插件,我可以像这样使用zul文件中的组件
,它应该正常工作吗?我只需要创建一个java类,它是
MyTextbox`并在zul文件中调用它。如果不定义zul文件,宏组件将不会有任何内容。您必须在java类中创建内容,然后它可能会工作。很抱歉,回复太晚,如果我同意您的建议,这意味着我必须在我的zk.xml中添加addon标记,我不需要像下面的例子那样将定义放在每个.zul文件的顶部:
,但是如果我喜欢添加上面的标记,我应该需要在我的zk.xml中添加标记插件吗?如果您将此标记添加到需要它的.zul文件中没有问题,您当然可以这样做。在这种情况下,不需要做进一步的操作,也不需要语言插件。我想这主要是一个品味问题。好吧,现在我将尝试将您的示例类
MyTextbox
添加到我的项目中,并尝试在我的zul中像这样导入
,而不使用
macroURI=“/zk/textbox.zul”
,因为我没有创建任何文件来定义插件,我可以像这样使用zul文件中的组件
,它应该正常工作吗?我只需要创建一个java类,它是
MyTextbox`并在zul文件中调用它。如果不定义zul文件,宏组件将不会有任何内容。您必须在java类中创建内容,然后它可能会工作。