vaadin网格 - 来自多个对象的数据
我想在一个网格中显示来自两个不同对象的数据。我有“文件夹”和“项目”,我希望在一个网格中看到它们。文件夹位于顶部,项目位于文件夹下方。类似于文件管理器应用程序中的列表视图。但我不知道如何将数据整合在一起。我可能可以使用我在网格中使用的 getter 方法为 Item 和 Folder 类创建一个抽象父类。对此有更好的解决方案吗?
预期结果:
@Route(value = "")
@PageTitle("Items | Test")
public class ListView extends VerticalLayout {
Grid<Item> grid = new Grid<>(Item.class);
ItemService service;
Folder currentFolder;
public ListView(ItemService service) {
this.service = service;
this.currentFolder = service.getAllFolders().get(0);
addClassName("list-view");
add(getGrid());
updateList();
}
private HorizontalLayout getGrid() {
HorizontalLayout layout = new HorizontalLayout(grid);
layout.setSizeFull();
grid.addClassNames("grid");
grid.setColumns("name");
grid.addColumn(testCase -> testCase.getStatus().getValue()).setHeader("Status").setSortable(true);
grid.addColumn(new ComponentRenderer<>(
testCase -> {
Checkbox checkbox = new Checkbox();
checkbox.setValue(testCase.getBooleanValue());
checkbox.setReadOnly(true);
return checkbox;
}
)
).setHeader("Boolean");
grid.getColumns().forEach(col -> col.setAutoWidth(true));
return layout;
}
private void updateList() {
grid.setItems(service.getItemsFromFolder(currentFolder));
}
}
服务:
@Service
public class ItemService {
private final ItemRepository itemRepository;
private final FolderRepository folderRepository;
public ItemService(ItemRepository itemRepository, FolderRepository folderRepository) {
this.itemRepository = itemRepository;
this.folderRepository = folderRepository;
}
public List<Folder> getAllFolders() {
return folderRepository.findAll();
}
public List<Item> getItemsFromFolder(Folder folder) {
return itemRepository.getItemsFromFolder(folder.getId());
}
}
项目存储库:
public interface ItemRepository extends JpaRepository<Item, Long> {
@Query("Select i from Item i where i.folder.id = :folderId")
List<Item> getItemsFromFolder(@Param("folderId") Long folderId);
}
文件夹存储库:
public interface FolderRepository extends JpaRepository<Folder, Long> {
}
项目实体:
@Entity
@Getter
@Setter
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty
private String name = "";
@Enumerated
@Column(columnDefinition = "smallint")
private Status status;
@NotNull
private Boolean booleanValue;
@ManyToOne
@JoinColumn(name = "folder_id")
@NotNull
private Folder folder;
}
文件夹实体:
@Entity
@Getter
@Setter
public class Folder {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Long parentFolderId;
}
状态枚举:
@AllArgsConstructor
public enum Status {
DRAFT("Draft"),
READY("Ready"),
OBSOLETE("Obsolete");
@Getter
private final String value;
}
I would like to show data from two different objects in one Grid. I have "folders" and "items" and I would like to see them together in one Grid. Folders at the top and items below folders. Something like list view in file manager application. But I don't know how to get the data together. I could probably create an abstract parent class for Item and Folder classes with getter methods, which I'm using in the grid. Is there any better solution for that?
Expected result:
@Route(value = "")
@PageTitle("Items | Test")
public class ListView extends VerticalLayout {
Grid<Item> grid = new Grid<>(Item.class);
ItemService service;
Folder currentFolder;
public ListView(ItemService service) {
this.service = service;
this.currentFolder = service.getAllFolders().get(0);
addClassName("list-view");
add(getGrid());
updateList();
}
private HorizontalLayout getGrid() {
HorizontalLayout layout = new HorizontalLayout(grid);
layout.setSizeFull();
grid.addClassNames("grid");
grid.setColumns("name");
grid.addColumn(testCase -> testCase.getStatus().getValue()).setHeader("Status").setSortable(true);
grid.addColumn(new ComponentRenderer<>(
testCase -> {
Checkbox checkbox = new Checkbox();
checkbox.setValue(testCase.getBooleanValue());
checkbox.setReadOnly(true);
return checkbox;
}
)
).setHeader("Boolean");
grid.getColumns().forEach(col -> col.setAutoWidth(true));
return layout;
}
private void updateList() {
grid.setItems(service.getItemsFromFolder(currentFolder));
}
}
Service:
@Service
public class ItemService {
private final ItemRepository itemRepository;
private final FolderRepository folderRepository;
public ItemService(ItemRepository itemRepository, FolderRepository folderRepository) {
this.itemRepository = itemRepository;
this.folderRepository = folderRepository;
}
public List<Folder> getAllFolders() {
return folderRepository.findAll();
}
public List<Item> getItemsFromFolder(Folder folder) {
return itemRepository.getItemsFromFolder(folder.getId());
}
}
Item Repository:
public interface ItemRepository extends JpaRepository<Item, Long> {
@Query("Select i from Item i where i.folder.id = :folderId")
List<Item> getItemsFromFolder(@Param("folderId") Long folderId);
}
Folder Repository:
public interface FolderRepository extends JpaRepository<Folder, Long> {
}
Item Entity:
@Entity
@Getter
@Setter
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty
private String name = "";
@Enumerated
@Column(columnDefinition = "smallint")
private Status status;
@NotNull
private Boolean booleanValue;
@ManyToOne
@JoinColumn(name = "folder_id")
@NotNull
private Folder folder;
}
Folder Entity:
@Entity
@Getter
@Setter
public class Folder {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Long parentFolderId;
}
Status enum:
@AllArgsConstructor
public enum Status {
DRAFT("Draft"),
READY("Ready"),
OBSOLETE("Obsolete");
@Getter
private final String value;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Grid 只能有一种类型的 bean,因此抽象父类或接口是最佳选择。但是考虑到“文件夹”和“项目”的用例描述,您是否考虑过使用 TreeGrid 而是?
Grid
can only have one type of bean, so an abstract parent class or interface is the way to go. But given the description of your use case of "folders" and "items", have you considered using TreeGrid instead?