当前位置: 首页 > 知识库问答 >
问题:

如何在Vaadin 8网格中使用Vaadin操作框架

甄煜
2023-03-14

使用Vaadin的Table类可以向表中添加操作处理程序。例如,在以前的Vaadin版本中,当用户在表格区域内单击鼠标右键时,屏幕上会显示以下2个选项:

Table aTable=new Table();
aTable.addActionHandler(new Action.Handler(){

public Action[] getActions(Object target, Object sender)
  {                           
  //example, that shows 2 options
  return new Action[] {new Action("Option 1"), new Action("Option 2")};

public void handleAction(Action action, Object sender, Object target)
  {//just prints action name for this example
   System.out.println("Action:"+action);
   }
});     

行动。处理程序存在于Vaadin 8中,但是不可能添加操作。在Vaadin 8中处理网格,我也没有找到任何其他方法来创建上下文菜单。

在网格中使用操作框架的方法是什么?Grid是否有其他创建上下文菜单的方法?换句话说,上面的例子是如何写的。

现有的文章和答案(例如:Vaadin Grid vs Table)没有涵盖上述主题,也没有在Vaadin文档(https://vaadin.com/docs/-/part/framework/components/components-grid.html)中记录。

共有1个答案

王楚青
2023-03-14

您可以使用自vaadin 7.6(在线演示和github源代码)以来引入的vaadin上下文菜单插件。理论上,它可以支持任何组件,但对于网格,我们将使用专用的GridContextMenu(记住重新编译widgetset)。

依赖:

<dependency>
   <groupId>com.vaadin</groupId>
   <artifactId>vaadin-context-menu</artifactId>
   <version>2.0.0</version>
</dependency>

实施:

import com.vaadin.contextmenu.GridContextMenu;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.Grid;
import com.vaadin.ui.Notification;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

public class MyUi extends UI {
    @Override
    protected void init(VaadinRequest request) {
        // basic grid setup
        Grid<Person> grid = new Grid<>(Person.class);
        grid.getColumns().forEach(column -> column.setHidable(true).setSortable(true));
        grid.setItems(
                new Person("Darth", "Vader"),
                new Person("Luke", "Skywalkaer"),
                new Person("Java", "De-Hut")
        );

        // grid context menu setup
        Random random = new Random();
        GridContextMenu<Person> contextMenu = new GridContextMenu<>(grid);
        // handle header right-click
        contextMenu.addGridHeaderContextMenuListener(event -> {
            contextMenu.removeItems();
            contextMenu.addItem("Hide", VaadinIcons.EYE_SLASH, selectedMenuItem -> {
                event.getColumn().setHidden(true);
            });
            contextMenu.addItem("Sort", VaadinIcons.LIST_OL, selectedMenuItem -> {
                grid.sort(event.getColumn().getId(), SortDirection.values()[random.nextInt(2)]);
            });
        });
        // handle item right-click
        contextMenu.addGridBodyContextMenuListener(event -> {
            contextMenu.removeItems();
            if (event.getItem() != null) {
                grid.select((Person) event.getItem());
                contextMenu.addItem("Info", VaadinIcons.INFO, selectedMenuItem -> {
                    Notification.show("Right-clicked item " + event.getItem());
                });
            }
        });

        // set UI content
        VerticalLayout content = new VerticalLayout();
        content.setSizeFull();
        content.addComponents(grid);
        setContent(content);
    }

    // basic bean
    public static class Person {
        private String firstName;
        private String lastName;

        public Person(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' +
                    '}';
        }
    }
}

结果:

 类似资料:
  • 我需要制作瓦丁8网格单元格文本换行。我试着在瓦丁论坛上关注这个链接。https://vaadin.com/forum/thread/16908210/vaadin-8-grid-wrap-long-lines 我的网格仅在每个单元格中包含字符串。 我有一个这样的风格生成器类: 我正在从Vaadin 6转换,所以我仍然使用旧主题() 在我的styles.css文件中,有: 在创建网格的类中,我有:

  • 有没有人知道如何建立一个动态瓦丁网格,就像这里:https://cdn.vaadin.com/vaadin-grid/2.0.0-alpha3/demo/data.html#dynamic-height 这很奇怪,因为我从未见过vaadin允许像上面的链接一样编写代码。将此模板放在哪里?有没有可能在标准的瓦丁代码中?

  • 在Vaadin 14+中,我正在创建网格,并希望用户有一个稳定/简单的方法将网格的内容导出到csv或Excel。要做到这一点,我感到惊讶的是,Vaadin似乎没有提供此功能,因此必须使用第三方开发插件(如https://Vaadin.com/directory/component/exporter/overview)。然而,这些插件有许多bug(例如不能将带有日期值的网格正确地导出到Excel等)

  • 我需要从网格(容器)中删除数据,然后我需要刷新行。我该怎么做? 现在我尝试只更改单元格而不删除项目。我的代码是 但是我也有错误…:( Morfic的信息: 我需要更改网格单元格中显示的数据。例如,我有3行,属性ID为firstNumber和secondNumber,第4行表示行的总和。所以,我从数据库中得到了一些数据。我需要包括一些数据手动“从键盘”到网格。。。 想象一下这种情况: firstNu

  • 在我的Vaadin流项目中,我有一个网格,我设置了一些项,但它显示像网格数据项 我想要一个体面的格式,用户可以看到具体的细节不喜欢。有什么想法或者vaadin中有什么成分可以让这个变得漂亮吗?

  • Vaadin网格允许定义为可编辑 这使得所有可见的列都可编辑。然而,我不希望用户编辑特定的列,但似乎可编辑是一个全或无。