如何在 Vaadin 7 中制作一对单选按钮来表示 True/False 值但本地化文本?

Posted

技术标签:

【中文标题】如何在 Vaadin 7 中制作一对单选按钮来表示 True/False 值但本地化文本?【英文标题】:How to make a pair of radio buttons in Vaadin 7 to represent True/False values but localized text? 【发布时间】:2014-12-08 18:02:30 【问题描述】:

我想要Vaadin 7 中的一对radio buttons 来表示布尔值,其中每个值都有一个文本显示,例如“Active”和“Inactive”。

【问题讨论】:

Vaadin 8 更新 – 现在容易多了。见my Answer。 【参考方案1】:

Vaadin 7

此答案针对问题中提出的 Vaadin 7。请注意,Vaadin 8 使这非常变得更容易。见my other Answer。

OptionGroup 小部件

在 Vaadin 7 中,单选按钮作为单个小部件处理,即OptionGroup 的一个实例。小部件包含多个Items,如果设置为single item selection mode,它们将显示为一组单选按钮。

项目 ID 与项目

对我来说棘手的部分是理解诸如addItem 之类的命令有点用词不当。我们没有传递完整的Item 实例。相反,我们传递一个对象作为item的id

addItem 命令获取项目 ID,生成一个 Item 实例并将其返回给您。这有明确的记录,但我花了一段时间才明白。您可能认为您有义务跟踪退回的项目。但是,不,您可以使用项目 ID 稍后检索或比较 OptionGroup 中的项目。

由于我们不需要跟踪返回的项目,我们可以调用addItems(复数)命令,使用一行代码为多个单选按钮创建多个项目。

作为项目 ID 的布尔值

在我们的例子中,我们希望使用布尔值作为我们的核心数据。我们需要对象而不是boolean 原语,因为我们在传递对象。所以我们使用Boolean 类。请注意,布尔类有几个方便的常量:Boolean.TRUEBoolean.FALSE

这些布尔对象可以用作项目 ID。

示例代码

一些使用 Vaadin 7.3.2 的示例代码。

this.activeCustomerRadio = new OptionGroup( "Filter By:" );  // Pass a string used as caption (title) of the group of radio buttons.
this.activeCustomerRadio.addItems( Boolean.TRUE , Boolean.FALSE );  // Pass item ids to be used in constructing Item objects on our behalf.
this.activeCustomerRadio.setItemCaption( Boolean.TRUE , "Active" ); // Specify a textual label rather than default generated value "true" & "false".
this.activeCustomerRadio.setItemCaption( Boolean.FALSE , "Inactive" );
this.activeCustomerRadio.setValue( Boolean.FALSE );  // Specify which radio button is selected by default.
// Add a listener to react to user selection.
this.activeCustomerRadio.addValueChangeListener( new Property.ValueChangeListener()


    @Override
    public void valueChange ( Property.ValueChangeEvent event )
    
        Notification.show( "Radio Button" ,
                "You chose: " + event.getProperty().getValue().toString() ,
                Notification.Type.HUMANIZED_MESSAGE );
    
 );

Lambda 语法

顺便说一句……在 Java 8 中,您可以使用新的备用 Lambda syntax。如果您愿意,NetBeans 8 会建议并执行转换为 lambda 语法。

this.activeSupplierRadio.addValueChangeListener(( Property.ValueChangeEvent event ) -> 
    Notification.show( "Radio Button" ,
            "You chose: " + event.getProperty().getValue().toString() ,
            Notification.Type.HUMANIZED_MESSAGE );
);

【讨论】:

鉴于Boolean.true == true 和编译器会自动装箱,你不能只传递true 吗?如果你这样做会怎样? 我是支持对象的阵营,希望 Java 从来没有原语。我想自动装箱可以在这段代码中使用。但我看不出有什么好处。【参考方案2】:

tl;博士

在 Vaadin 8 中要简单得多。

radios.setItems( Boolean.TRUE , Boolean.FALSE );

……和……

radios.setItemCaptionGenerator( ( ItemCaptionGenerator < Boolean > ) item ->

    return item ? "Active" : "Inactive"; // Alternate labels.
 );

Vaadin 8

在 Vaadin 8 中更简单更直观!

Vaadin 8 带来了一个新的 simplified data model,利用 Java 语言的现代特性消除了将您的内容包装在 old data model 中的 Container 接口。

支持Java Generics 意味着单选按钮小部件知道您的内容项的类型。在这个问题的情况下,该类型是 Boolean 类。

RadioButtonGroup < Boolean > radios = new RadioButtonGroup <>( "T/F:" );

传递要由单选按钮表示的对象

现在我们只需将对象扔到一个小部件上,例如RadioButtonGroup。在这个问题的情况下,我们抛出一对Boolean 对象,预定义常量Boolean.TRUEBoolean.FALSE。反转参数的顺序以更改呈现给用户的单选按钮的顺序。

radios.setItems( Boolean.TRUE , Boolean.FALSE );

要预先选择其中一个单选按钮,只需参考所需的项目对象。这将是常数,Boolean.TRUEBoolean.FALSE

radios.setValue( Boolean.FALSE );

对于我们为每个单选按钮呈现给用户的标签,默认情况下每个项目对象都会调用其toString 方法。对于我们来说,这意味着truefalse 将是用于单选按钮标签的文本。

生成标签

我们的问题在这里需要我们的单选按钮的替代标签,例如localization。因此,我们调用setItemCaptionGenerator 并传递一个little generator,我们为每个单选按钮生成一个字符串。

我们的生成器使用ternary operator,方便用于基于布尔值的条件。请记住,在以下代码中,itemBoolean 对象。

radios.setItemCaptionGenerator( new ItemCaptionGenerator < Boolean >( )

    @Override
    public String apply ( Boolean item )
    
        return item ? "vrai" : "faux"; // French for "true"/"false".
    
 );

或者使用 lambda 语法。

radios.setItemCaptionGenerator( ( ItemCaptionGenerator < Boolean > ) item ->

    return item ? "vrai" : "faux"; // French for "true"/"false".
 );

这里是相同的Boolean 对象的屏幕截图,这些对象带有法语标签。

在问题中特别要求,“活动”和“不活动”。

radios.setItemCaptionGenerator( ( ItemCaptionGenerator < Boolean > ) item ->

    return item ? "Active" : "Inactive"; // Alternate labels.
 );

回复用户

您可能希望在用户想要单击单选按钮时做出响应。添加值更改侦听器。注意我们是如何被告知用户选择的项目背后的object,而不是我们生成的标签的文本。由于 Java 泛型,对 event.getValue( ) 的调用返回类型 Boolean 而无需强制转换——这里的代码知道单选按钮代表 Boolean 对象,而不仅仅是文本。

radios.addValueChangeListener( new HasValue.ValueChangeListener < Boolean >( )

    @Override
    public void valueChange ( HasValue.ValueChangeEvent < Boolean > event )
    
        Notification.show(
                "User chose: " + event.getValue( ) ,
                Notification.Type.TRAY_NOTIFICATION
        );
    
 );

或者使用 lambda 语法。

radios.addValueChangeListener( ( HasValue.ValueChangeListener < Boolean > ) event -> Notification.show(
        "User chose: " + event.getValue( ) ,
        Notification.Type.TRAY_NOTIFICATION
) );

整个例子

这是一个完整的工作示例,在单个类文件中。

package com.example.vaadin.radio;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.data.HasValue;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.*;

/**
 * This UI is the application entry point. A UI may either represent a browser window
 * (or tab) or some part of a html page where a Vaadin application is embedded.
 * <p>
 * The UI is initialized using @link #init(VaadinRequest). This method is intended to be
 * overridden to add component to the user interface and initialize non-component functionality.
 */
@Theme ( "mytheme" )
public class MyUI extends UI


    @Override
    protected void init ( VaadinRequest vaadinRequest )
    
        final VerticalLayout layout = new VerticalLayout( );

        RadioButtonGroup < Boolean > radios = new RadioButtonGroup <>( "T/F:" );
        radios.setItems( Boolean.TRUE , Boolean.FALSE );
        radios.setValue( Boolean.FALSE );
        radios.setItemCaptionGenerator( ( ItemCaptionGenerator < Boolean > ) item ->
        
            return item ? "vrai" : "faux"; // French for "true"/"false".
         );
        radios.addValueChangeListener( new HasValue.ValueChangeListener < Boolean >( )
        
            @Override
            public void valueChange ( HasValue.ValueChangeEvent < Boolean > event )
            
                Notification.show(
                        "User chose: " + event.getValue( ) ,
                        Notification.Type.TRAY_NOTIFICATION
                );
            
         );

        layout.addComponent( radios );
        setContent( layout );
    

    @WebServlet ( urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true )
    @VaadinServletConfiguration ( ui = MyUI.class, productionMode = false )
    public static class MyUIServlet extends VaadinServlet
    
    

更多信息

请参阅manual for radio buttons。

参见Sampler 中的radio button example。

What's new in Vaadin

【讨论】:

以上是关于如何在 Vaadin 7 中制作一对单选按钮来表示 True/False 值但本地化文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中使用listview builder制作动态单选按钮?

如何在表单之外制作单选按钮?

你如何在循环中制作单选按钮

如何在Django管理员中制作单选按钮

如何在iphone中制作单选按钮和复选框按钮?

LibreOffice:如何制作单选按钮组