# 布局
---
**布局 (Layout)** 是一个现代化的、模块化的库,旨在简化在 Minecraft 中使用 Bukkit API 创建和管理交互式清单的过程。它提供流畅的语法和对菜单行为的完全控制,使您能够快速高效地构建 GUI。
---
## 主要特性
### 尺寸和固定清单
创建可变尺寸的清单(例如箱子)或固定尺寸的清单(例如合成台和砂石),以适应您的项目的需求。
### 完全自定义
控制菜单的各个方面:
* **交互式物品**: 定义具有自定义点击逻辑的物品,用于点击事件(左键、右键、中键)。
* **清单行为**: 分配打开、关闭或清单内部常规点击等事件的操作。
* **灵活的模式**: 使用基于字符的模式设计复杂的菜单,以可视化组织您的物品。
### 模块化设计
该库被划分为模块,以促进组织和可扩展性:
* **`layout`**: 包含清单构建和管理的内核逻辑。
* **`item`**: 处理在清单中使用的物品的创建和操作。
* **`plugin`**: 包含代码示例,演示该库的实际用途。 此模块非常适合学习语法和了解不同概念的应用方式。
---
## 开发人员优势
* **快速开发**: 大大简化了菜单创建过程,让您可以专注于插件的功能。
* **清晰的代码**: 流畅的语法会产生更具可读性和可维护性的代码。
* **巨大的潜力**: 支持多种清单类型和行为,使其成为广泛插件的强大解决方案。
## 示例用法
[点击这里了解更多用法示例和文档。](https://github.com/Bytephoria/layout/blob/main/docs/layout-usage.md)
```java
final LayoutSizedInventory layoutSizedInventory = Layout.sized()
.title(Component.text("This is a sized example menu!", NamedTextColor.BLACK))
.size(5)
// Add a clickable item with multiple click handlers
.item(22, ClickableItemLayout.builder()
.material(Material.NETHERITE_PICKAXE)
.displayName(Component.text("Netherite Pickaxe", NamedTextColor.GREEN))
.lore(
Component.text("Line 1", NamedTextColor.GREEN),
Component.text("Line 2", NamedTextColor.LIGHT_PURPLE)
)
.onLeftClick(clickContext -> clickContext.player().sendMessage("Left click!"))
.onRightClick(clickContext -> clickContext.player().sendMessage("Right click!"))
.onMiddleClick(clickContext -> clickContext.player().sendMessage("Middle click!"))
.build()
)
// Fill specific rows and columns with items
.row(1, ItemLayout.display(Material.RED_STAINED_GLASS_PANE))
.row(3, ItemLayout.display(Material.GREEN_STAINED_GLASS_PANE))
.column(2, ItemLayout.display(Material.LIME_STAINED_GLASS_PANE).buil)
.column(6, ItemLayout.display(Material.LIGHT_BLUE_STAINED_GLASS_PANE))
// Define inventory behavior
.behavior(layoutBehaviorBuilder -> layoutBehaviorBuilder
.cancelAllClicks(false)
.cancelLayoutClicks(true)
.allowPlayerInventoryClicks(true)
.ignoreEmptySlots(true)
.onClick(context -> context.player().sendMessage("Clicked on inventory!"))
.onOpen(openContext -> openContext.player().sendMessage("Inventory opened!"))
.onClose(closeContext -> closeContext.player().sendMessage("Inventory closed!"))
)
.build();
layoutSizedInventory.open(player);
```