如何在 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.TRUE
和Boolean.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.TRUE
和Boolean.FALSE
。反转参数的顺序以更改呈现给用户的单选按钮的顺序。
radios.setItems( Boolean.TRUE , Boolean.FALSE );
要预先选择其中一个单选按钮,只需参考所需的项目对象。这将是常数,Boolean.TRUE
或 Boolean.FALSE
。
radios.setValue( Boolean.FALSE );
对于我们为每个单选按钮呈现给用户的标签,默认情况下每个项目对象都会调用其toString
方法。对于我们来说,这意味着true
和false
将是用于单选按钮标签的文本。
生成标签
我们的问题在这里需要我们的单选按钮的替代标签,例如localization。因此,我们调用setItemCaptionGenerator
并传递一个little generator,我们为每个单选按钮生成一个字符串。
我们的生成器使用ternary operator,方便用于基于布尔值的条件。请记住,在以下代码中,item
是 Boolean
对象。
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 值但本地化文本?的主要内容,如果未能解决你的问题,请参考以下文章