27.md 7.9 KB
Newer Older
W
wizardforcel 已提交
1
# Vaadin `Grid`教程
W
wizardforcel 已提交
2 3 4 5 6 7 8

> 原文: [http://zetcode.com/vaadin/grid/](http://zetcode.com/vaadin/grid/)

在 Vaadin Grid 教程中,我们学习了 Vaadin Grid 组件的基础知识。 Vaadin 网格示例显示网格中来自 MySQL 数据库的数据。

## Vaadin 框架

W
wizardforcel 已提交
9
Vaadin 是一种流行的 Java Web 开发框架,用于构建单页 Web 应用。
W
wizardforcel 已提交
10

W
wizardforcel 已提交
11
## Vaadin `Grid`
W
wizardforcel 已提交
12 13 14

`Grid`组件用于显示和编辑以行和列排列的表格数据。

W
wizardforcel 已提交
15
## Vaadin `Grid`示例
W
wizardforcel 已提交
16 17 18

以下示例演示了 Vaadin `Grid`组件的用法。 我们从 MySQL 数据库加载数据并将其显示在`Grid`组件中。

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

W
wizardforcel 已提交
21
```java
W
wizardforcel 已提交
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.42</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.9.RELEASE</version>
</dependency>

```

我们向 POM 文件添加了两个依赖关系:MySQL 驱动程序和 JdbcTemplate 库。 JdbcTemplate 简化了 Java 中的数据库编程。

`cars_mysql.java`

W
wizardforcel 已提交
40
```java
W
wizardforcel 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
-- SQL for the Cars table

CREATE TABLE Cars(Id BIGINT PRIMARY KEY AUTO_INCREMENT, 
        Name VARCHAR(150), Price INTEGER);

INSERT INTO Cars(Name, Price) VALUES('Audi', 52642);
INSERT INTO Cars(Name, Price) VALUES('Mercedes', 57127);
INSERT INTO Cars(Name, Price) VALUES('Skoda', 9000);
INSERT INTO Cars(Name, Price) VALUES('Volvo', 29000);
INSERT INTO Cars(Name, Price) VALUES('Bentley', 350000);
INSERT INTO Cars(Name, Price) VALUES('Citroen', 21000);
INSERT INTO Cars(Name, Price) VALUES('Hummer', 41400);
INSERT INTO Cars(Name, Price) VALUES('Volkswagen', 21600);

```

这是 MySQL 数据库表的数据。

`MyUI.java`

W
wizardforcel 已提交
61
```java
W
wizardforcel 已提交
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
package com.zetcode.main;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.zetcode.bean.Car;
import com.zetcode.service.ReadCars;
import java.util.List;

@Theme("mytheme")
public class MyUI extends UI {

    @Override
    protected void init(VaadinRequest vaadinRequest) {

        VerticalLayout vbox = new VerticalLayout();

        HorizontalLayout hbox = new HorizontalLayout();

        Grid grid = new Grid();

        grid.addColumn("Id", Long.class);
        grid.addColumn("Name", String.class);
        grid.addColumn("Price", Integer.class);

        Button loadButton = new Button("Load data");
        loadButton.addClickListener(e -> {

            grid.getContainerDataSource().removeAllItems();

            List<Car> cars = ReadCars.read();

            for (Car car : cars) {

                grid.addRow(car.getId(), car.getName(), car.getPrice());
            }
        });

        Button clearButton = new Button("Clear data");
        clearButton.addClickListener(e -> {
            grid.getContainerDataSource().removeAllItems();
        });

        vbox.addComponents(grid);
        hbox.addComponents(loadButton, clearButton);
        hbox.setSpacing(true);
        vbox.addComponent(hbox);
        vbox.setMargin(true);
        vbox.setSpacing(true);

        setContent(vbox);
    }

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

```

W
wizardforcel 已提交
131
这是`MyUI`类。 它是应用的入口点。 我们有一个`Grid`组件和两个按钮。 一个按钮从数据库中加载数据并将其插入`Grid`,另一按钮从`Grid`中删除数据。
W
wizardforcel 已提交
132

W
wizardforcel 已提交
133
```java
W
wizardforcel 已提交
134 135 136 137 138 139 140 141
VerticalLayout vbox = new VerticalLayout();

HorizontalLayout hbox = new HorizontalLayout();

```

要创建布局,我们使用`HorizontalLayout``VerticalLayout`

W
wizardforcel 已提交
142
```java
W
wizardforcel 已提交
143 144 145 146 147 148
Grid grid = new Grid();

```

`Grid`组件已创建。

W
wizardforcel 已提交
149
```java
W
wizardforcel 已提交
150 151 152 153 154 155 156 157
grid.addColumn("Id", Long.class);
grid.addColumn("Name", String.class);
grid.addColumn("Price", Integer.class);

```

使用`addColumn()`方法,我们向`Grid`添加新列。 方法的第二个参数是列的日期类型。

W
wizardforcel 已提交
158
```java
W
wizardforcel 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
Button loadButton = new Button("Load data");
loadButton.addClickListener(e -> {

    grid.getContainerDataSource().removeAllItems();

    List<Car> cars = ReadCars.read();

    for (Car car : cars) {

        grid.addRow(car.getId(), car.getName(), car.getPrice());
    }
});

```

加载按钮从数据库加载数据并将其插入`Grid`。 数据库工作委托给`ReadCars.read()`方法。 使用`addRow()`方法将新行添加到网格中。

W
wizardforcel 已提交
176
```java
W
wizardforcel 已提交
177 178 179 180 181 182 183 184 185
Button clearButton = new Button("Clear data");
clearButton.addClickListener(e -> {
    grid.getContainerDataSource().removeAllItems();
});

```

清除按钮将从`Grid`中删除所有数据。 `removeAllItems()`方法可以完成这项工作。

W
wizardforcel 已提交
186
```java
W
wizardforcel 已提交
187 188 189 190 191 192 193 194 195
vbox.addComponents(grid);
hbox.addComponents(loadButton, clearButton);

```

组件将添加到布局管理器。

`Car.java`

W
wizardforcel 已提交
196
```java
W
wizardforcel 已提交
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
package com.zetcode.bean;

public class Car {

    private Long id;
    private String name;
    private int price;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

```

这是`Car` bean; 它包含`id``name``price`属性。

`ReadCars.java`

W
wizardforcel 已提交
236
```java
W
wizardforcel 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
package com.zetcode.service;

import com.zetcode.bean.Car;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;

public class ReadCars {

    public static List<Car> read()  {

        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=true";

        SimpleDriverDataSource ds = new SimpleDriverDataSource();

        try {
            ds.setDriver(new com.mysql.jdbc.Driver());
        } catch (SQLException ex) {
            Logger.getLogger(ReadCars.class.getName()).log(Level.SEVERE, null, ex);
        }

        ds.setUsername("testuser");
        ds.setPassword("test623");
        ds.setUrl(url);

        String sql = "SELECT * FROM Cars";

        JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
        List<Car> cars = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Car.class));

        return cars;
    }
}

```

`ReadCars`包含连接到 MySQL 数据库并从 Cars 表中检索所有汽车的代码。 我们使用 Spring 的 JdbcTemplate 来完成这项工作。

W
wizardforcel 已提交
279
```java
W
wizardforcel 已提交
280 281 282 283 284 285
String url = "jdbc:mysql://localhost:3306/testdb?useSSL=true";

```

这是 MySQL 数据库的连接 URL。 数据库名称为`testdb`

W
wizardforcel 已提交
286
```java
W
wizardforcel 已提交
287 288 289 290 291 292
String sql = "SELECT * FROM Cars";

```

该 SQL 语句从 Cars 表中选择所有行。

W
wizardforcel 已提交
293
```java
W
wizardforcel 已提交
294 295 296 297 298 299 300
JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
List<Car> cars = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Car.class));

```

`BeanPropertyRowMapper`的帮助下,该工具自动将结果集列映射到`Car`类的属性,我们从 Cars 表中检索所有行并将其映射到`Car`对象的列表。

W
wizardforcel 已提交
301
```java
W
wizardforcel 已提交
302 303 304 305 306 307 308 309 310 311 312
return cars;

```

汽车列表将返回给呼叫者。

![Vaadin Grid](img/55afcdba2bb63a429b49f00ae25053aa.jpg)

Figure: Vaadin Grid

在本教程中,我们学习了 Vaadin Grid 组件的基础知识。 您可能也对相关教程感兴趣: [Vaadin TextArea 教程](/vaadin/textarea/)[Vaadin ComboBox 教程](/vaadin/combobox/)[Vaadin Slider 教程](/vaadin/slider/)[Vaadin CheckBox 教程](/vaadin/checkbox/)[Java 教程](/lang/java/)