原文: http://zetcode.com/vaadin/combobox/

在 Vaadin ComboBox教程中,我们学习 Vaadin ComboBox组件的基础知识。 Vaadin ComboBox示例在标签组件中显示选定的值。

Vaadin

Vaadin 是一种流行的 Java Web 开发框架,用于构建单页 Web 应用。

Vaadin ComboBox

ComboBox是允许从下拉列表中选择项目的选择组件。 在可编辑模式下,可以输入新值。

Vaadin ComboBox示例

以下程序演示了 Vaadin ComboBox组件的用法。 从ComboBox中选择的值显示在标签组件中。

NetBeans IDE 可用于轻松创建 Vaadin Web 应用。 我们需要安装 NetBeans Vaadin 插件,然后创建一个新的 Vaadin Web 应用项目。

MyUI.java

  1. package com.zetcode.ui;
  2. import javax.servlet.annotation.WebServlet;
  3. import com.vaadin.annotations.Theme;
  4. import com.vaadin.annotations.Title;
  5. import com.vaadin.annotations.VaadinServletConfiguration;
  6. import com.vaadin.data.HasValue;
  7. import com.vaadin.server.VaadinRequest;
  8. import com.vaadin.server.VaadinServlet;
  9. import com.vaadin.ui.Alignment;
  10. import com.vaadin.ui.ComboBox;
  11. import com.vaadin.ui.HorizontalLayout;
  12. import com.vaadin.ui.Label;
  13. import com.vaadin.ui.UI;
  14. @Theme("mytheme")
  15. @Title("Vaadin ComboBox")
  16. public class MyUI extends UI {
  17. @Override
  18. protected void init(VaadinRequest vaadinRequest) {
  19. HorizontalLayout layout = new HorizontalLayout();
  20. Label lbl = new Label();
  21. ComboBox<String> cb = new ComboBox<>();
  22. cb.setTextInputAllowed(false);
  23. cb.setItems("Ubuntu", "Debian", "Arch", "Mint");
  24. cb.setEmptySelectionAllowed(false);
  25. cb.addValueChangeListener((HasValue.ValueChangeEvent<String> event) -> {
  26. String item = event.getValue();
  27. lbl.setValue(item);
  28. });
  29. layout.addComponents(cb, lbl);
  30. layout.setComponentAlignment(lbl, Alignment.MIDDLE_CENTER);
  31. layout.setMargin(true);
  32. setContent(layout);
  33. }
  34. @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
  35. @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
  36. public static class MyUIServlet extends VaadinServlet {
  37. }
  38. }

这是MyUI类。

  1. HorizontalLayout layout = new HorizontalLayout();

在我们的示例中,我们使用HorizontalLayout连续显示两个组件。

  1. Label lbl = new Label("");

Label组件不显示从组合框中选择的值。

  1. ComboBox<String> cb = new ComboBox<>();

创建一个ComboBox组件。

  1. cb.setTextInputAllowed(false);

使用setTextInputAllowed()方法,可以禁用ComboBox的可编辑模式。

  1. cb.setItems("Ubuntu", "Debian", "Arch", "Mint");

使用setItems(),我们将四个字符串元素添加到ComboBox中。

  1. cb.setEmptySelectionAllowed(false);

默认情况下,ComboBox显示一个空项目,允许用户不选择任何项目。 我们使用setEmptySelectionAllowed()禁用此选项。

  1. cb.addValueChangeListener((HasValue.ValueChangeEvent<String> event) -> {
  2. String item = event.getValue();
  3. lbl.setValue(item);
  4. });

使用addValueChangeListener(),我们为ComboBox中的值更改添加了一个监听器。 我们用getValue()方法获得ComboBox当前选择的项目。 使用setValue()方法将检索到的值设置为标签。

  1. layout.addComponents(cb, lbl);

通过addComponents()方法将这两个组件添加到HorizontalLayout

  1. layout.setComponentAlignment(lbl, Alignment.MIDDLE_CENTER);

我们将标签放置在setComponentAlignment()Alignment.MIDDLE_CENTER对齐的行中间。

  1. layout.setMargin(true);

我们在HorizontalLayout周围留了一些余量。

mytheme.scss

  1. @import "../valo/valo.scss";
  2. @mixin mytheme {
  3. @include valo;
  4. .v-horizontal > .v-spacing {
  5. width: 2em;
  6. }
  7. }

我们增加了HorizontalLayout中组件之间的间距。

Vaadin `ComboBox`教程 - 图1

图:Vaadin ComboBox

Vaadin ComboBox示例 II

在第二个示例中,ComboBox填充了从服务方法中检索到的城市对象的列表。 使用setItemCaptionGenerator()产生ComboBox中显示的字符串。

City.java

  1. package com.zetcode.bean;
  2. import java.io.Serializable;
  3. public class City implements Serializable {
  4. private static final long serialVersionUID = 1L;
  5. private Long id;
  6. private String name;
  7. private int population;
  8. public City() {
  9. }
  10. public City(Long id, String name, int population) {
  11. this.id = id;
  12. this.name = name;
  13. this.population = population;
  14. }
  15. public Long getId() {
  16. return id;
  17. }
  18. public void setId(Long id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public int getPopulation() {
  28. return population;
  29. }
  30. public void setPopulation(int population) {
  31. this.population = population;
  32. }
  33. @Override
  34. public String toString() {
  35. return "City{" + "id=" + id + ", name=" + name +
  36. ", population=" + population + '}';
  37. }
  38. }

这是City bean; 它包含idnamepopulation属性。

ICityService.java

  1. package com.zetcode.service;
  2. import com.zetcode.bean.City;
  3. import java.util.List;
  4. public interface ICityService {
  5. public List<City> findAll();
  6. }

ICityService定义findAll()合约方法。

CityService.java

  1. package com.zetcode.service;
  2. import com.zetcode.bean.City;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class CityService implements ICityService {
  6. @Override
  7. public List<City> findAll() {
  8. List<City> cities = new ArrayList<>();
  9. cities.add(new City(1L, "Bratislava", 432000));
  10. cities.add(new City(2L, "Budapest", 1759000));
  11. cities.add(new City(3L, "Prague", 1280000));
  12. cities.add(new City(4L, "Warsaw", 1748000));
  13. cities.add(new City(5L, "Los Angeles", 3971000));
  14. cities.add(new City(6L, "New York", 8550000));
  15. cities.add(new City(7L, "Edinburgh", 464000));
  16. cities.add(new City(8L, "Berlin", 3671000));
  17. return cities;
  18. }
  19. }

CityService返回City对象的列表。

MyUI.java

  1. package com.zetcode.ui;
  2. import javax.servlet.annotation.WebServlet;
  3. import com.vaadin.annotations.Theme;
  4. import com.vaadin.annotations.Title;
  5. import com.vaadin.annotations.VaadinServletConfiguration;
  6. import com.vaadin.data.HasValue;
  7. import com.vaadin.server.VaadinRequest;
  8. import com.vaadin.server.VaadinServlet;
  9. import com.vaadin.ui.Alignment;
  10. import com.vaadin.ui.ComboBox;
  11. import com.vaadin.ui.HorizontalLayout;
  12. import com.vaadin.ui.Label;
  13. import com.vaadin.ui.UI;
  14. import com.zetcode.bean.City;
  15. import com.zetcode.service.CityService;
  16. @Theme("mytheme")
  17. @Title("Vaadin ComboBox")
  18. public class MyUI extends UI {
  19. @Override
  20. protected void init(VaadinRequest vaadinRequest) {
  21. CityService cityService = new CityService();
  22. HorizontalLayout layout = new HorizontalLayout();
  23. Label lbl = new Label();
  24. ComboBox<City> cb = new ComboBox<>();
  25. cb.setTextInputAllowed(false);
  26. cb.setItems(cityService.findAll());
  27. cb.setEmptySelectionAllowed(false);
  28. cb.setItemCaptionGenerator(City::getName);
  29. cb.addValueChangeListener((HasValue.ValueChangeEvent<City> event) -> {
  30. City city = event.getValue();
  31. String item = String.format("%s: %s", city.getName(),
  32. city.getPopulation());
  33. lbl.setValue(item);
  34. });
  35. layout.addComponents(cb, lbl);
  36. layout.setComponentAlignment(lbl, Alignment.MIDDLE_CENTER);
  37. layout.setMargin(true);
  38. setContent(layout);
  39. }
  40. @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
  41. @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
  42. public static class MyUIServlet extends VaadinServlet {
  43. }
  44. }

这是MyUI类。

  1. ComboBox<City> cb = new ComboBox<>();

创建参数化的ComboBox

  1. cb.setItems(cityService.findAll());

ComboBox中填充了服务方法中的数据。

  1. cb.setItemCaptionGenerator(City::getName);

使用setItemCaptionGenerator(),我们选择要在ComboBox中显示为项目标签的城市名称。

  1. cb.addValueChangeListener((HasValue.ValueChangeEvent<City> event) -> {
  2. City city = event.getValue();
  3. String item = String.format("%s: %s", city.getName(),
  4. city.getPopulation());
  5. lbl.setValue(item);
  6. });

在标签中,我们显示城市名称及其人口,并用冒号分隔。

在本教程中,我们展示了 Vaadin ComboBox组件的基础知识。 您可能也对相关教程感兴趣: Vaadin 网格教程Vaadin Button教程Vaadin 滑块教程Vaadin CheckBox教程Java 教程