使用 Java 以编程方式在 Vaadin 14 中通过 CSS 指定背景图像

Specify a background image via CSS in Vaadin 14 programmatically with Java

在 Vaadin 14 中,我们可以在 Java 代码中以编程方式设置一些 CSS 值。

我们可以调用 getElement, then getStyle,并设置 CSS 属性 的名称和一个值。

比如这里我们设置背景色为绿色

public class MainView extends VerticalLayout
{
    public MainView ( )
    {
        this.getElement().getStyle().set( "background-color" , "Green" );

我们如何为 CSS 属性 这样的 background-image 执行此操作,它接受名为 url 的 CSS 函数的参数?

硬编码 CSS 路径不起作用。

public class MainView extends VerticalLayout
{
    public MainView ( )
    {
        this.getElement().getStyle().set( "background-image" , "cat.jpg" );

➥ 在Vaadin Flow中,我们如何使用Java得到CSS来找到像"cat.jpg"这样的图像?

此外,该图像文件的相对路径或绝对路径应该是什么?我知道在 Vaadin 网络应用程序中静态图像通常位于 src/main/resources 文件夹中。

如果是 "Plain Java Servlet"(非 Spring, non-CDI)Vaadin 项目,该文件应位于 /src/main/webapp

在 Spring 的情况下:/src/main/resources/META-INF/resources/img

摘自此处的官方文档:Resource Cheat Sheet

而且,正如@symlink 在评论中注意到的那样,您应该使用 url('filename') 语法来引用 css 中的图像:CSS background-image Property

例如,如果我在 /src/main/webapp/images 中有一个名为 cat.jpg 的文件,则将其设置为 getElement().getStyle().set("background-image","url('images/cat.jpg')");


这是另一个示例,src/main/webapp 中的图片文件 cat.jpg 没有嵌套在 images 文件夹中。这是一个 Vaadin 14.0.10 网络应用程序,使用 Start a new project with Vaadin 页面上的 Plain Java Servlet 技术堆栈选项。

以下是使用此图像作为背景的整个视图的源代码。

注意构造函数的第一行,我们在其中传递 "url('cat.jpg')" 作为参数。查看我们如何在文件名周围使用单引号来嵌入 Java 字符串而不进行转义。幸运的是,CSS 规范允许使用单引号 (') 或双引号 (") — 这对于 Vaadin 程序员在 Java 代码中嵌入 CSS 非常方便。

package work.basil.example;

import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.server.PWA;

/**
 * The main view contains a button and a click listener.
 */
@Route ( "" )
@PWA ( name = "Project Base for Vaadin", shortName = "Project Base" )
public class MainView extends VerticalLayout
{
    public MainView ( )
    {
        this.getElement().getStyle().set( "background-image" , "url('cat.jpg')" );

        Button button = new Button( "Click me" , event -> Notification.show( "Clicked!" ) );
        add( button );
    }
}

以及此网络应用程序的屏幕截图。由于 VerticalLayout 的高度较短,图像被裁剪了。布局很短,因为它只包含一个按钮,其标签 Click me 可以在左边缘的蓝色文本中依稀看到。裁剪后的猫脸在页面上重复出现,这是 CSS 的默认设置。